脉冲云在线指定Dockerfile文件--如何编写Dockerfile文件

来源:互联网 发布:淘宝店铺首页模板 编辑:程序博客网 时间:2024/06/07 11:16

如何编写Dockerfile文件

[脉冲云](https://maichong.io)编译构建步骤中,在[编译镜像](http://maichong.io)时,需要指定Dockerfile文件,大家可以参考下面的内容,来写适合自己的Dockerfile文件。

首先我们先编写.dockerignore文件来忽略一下文件

  1. 编写.dockerignore文件

    构建镜像时,Docker需要先准备context ,将所有需要的文件收集到进程中。默认的context包含Dockerfile目录中的所有文件,但是实际上,我们并不需要.git目录,node_modules目录等内容。 .dockerignore 的作用和语法类似于 .gitignore,可以忽略一些不需要的文件,这样可以有效加快镜像构建时间,同时减少Docker镜像的大小。示例如下:

    .git/
    node_modules/
    runtime/
    *.log

下面我们可以编写Dockerfile文件

2.FROM 指定基础镜像

基础镜像是必须指定的,使用 FROM 来指定基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令。FROM maichong/node:7.6.0-wheezy

3.RUN 执行命令

 RUN 指令是用来执行命令行命令的。由于命令行的强大能力,RUN 指令在定制镜像时是最常用的指令之一。Dockerfile 中每一个指令都会建立一层。可以使用 && 将各个所需命令串联起来,使用一个Run 指令来只建立一层。RUN npm install --development \ && rm -R ~/.npm*
  1. 设置WORKDIR和 CMD

    WORKDIR指令可以设置默认目录,也就是运行RUN / CMD / ENTRYPOINT指令的地方。

    CMD指令可以设置容器创建是执行的默认命令。另外,你应该讲命令写在一个数组中,数组中每个元素为命令的每个单词(参考官方文档)。

    FROM maichong/node:7.6.0-wheezy

    MAINTAINER Zhao Lei zhao@maichong.it

    COPY package.json /app/
    WORKDIR /app

    RUN npm install –development \
    && rm -R ~/.npm*
    COPY . /app
    CMD node server.js

    EXPOSE 5050

  2. COPY与ADD优先使用前者

    COPY指令非常简单,仅用于将文件拷贝到镜像中。ADD相对来讲复杂一些,可以用于下载远程文件以及解压压缩包(参考官方文档)。

  3. 合理调整COPY与RUN的顺序

    我们应该把变化最少的部分放在Dockerfile的前面,这样可以充分利用镜像缓存。

示例中,源代码会经常变化,则每次构建镜像时都需要重新安装NPM模块,这显然不是我们希望看到的。因此我们可以先拷贝package.json,然后安装NPM模块,最后才拷贝其余的源代码。这样的话,即使源代码变化,也不需要重新安装NPM模块。

FROM maichong/node:7.6.0-wheezyMAINTAINER Zhao Lei <zhao@maichong.it>COPY package.json /app/WORKDIR /appRUN npm install --development \ && rm -R ~/.npm*COPY . /appCMD node server.jsEXPOSE 5050

7.EXPOSE 声明端口

 EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P时,会自动随机映射 EXPOSE 的端口。EXPOSE 5050

8.ENV 设置环境变量

这个指令很简单,就是设置环境变量而已,无论是前面的其它指令,如 RUN,还是运行时的应用,都可以直接使用这里定义的环境变量。ENV NODE_VERSION 7.2.0

9.VOLUME 定义匿名卷

在 Dockerfile 中,我们可以事先指定某些目录挂载为匿名卷,这样在运行时如果用户不指定挂载,其应用也可以正常运行,不会向容器存储层写入大量数据。VOLUME /data

更多资料参考:

https://blog.fundebug.com/2017/05/15/write-excellent-dockerfile/

https://yeasy.gitbooks.io/docker_practice/content/image/dockerfile/

原创粉丝点击