作者:平凡数码广场 | 来源:互联网 | 2023-10-12 18:40
如何编写Dockerfile文件[脉冲云](https:maichong.io)编译构建步骤中,在[编译镜像](http:maichong.io)时,需要指定Dockerfile文
如何编写Dockerfile文件
[脉冲云](https://maichong.io)编译构建步骤中,在[编译镜像](http://maichong.io)时,需要指定Dockerfile文件,大家可以参考下面的内容,来写适合自己的Dockerfile文件。
首先我们先编写.dockerignore文件来忽略一下文件
编写.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*
设置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
COPY与ADD优先使用前者
COPY指令非常简单,仅用于将文件拷贝到镜像中。ADD相对来讲复杂一些,可以用于下载远程文件以及解压压缩包(参考官方文档)。
合理调整COPY与RUN的顺序
我们应该把变化最少的部分放在Dockerfile的前面,这样可以充分利用镜像缓存。
示例中,源代码会经常变化,则每次构建镜像时都需要重新安装NPM模块,这显然不是我们希望看到的。因此我们可以先拷贝package.json,然后安装NPM模块,最后才拷贝其余的源代码。这样的话,即使源代码变化,也不需要重新安装NPM模块。
FROM maichong/node:7.6.0-wheezy
MAINTAINER Zhao Lei
COPY package.json /app/
WORKDIR /app
RUN npm install --development \
&& rm -R ~/.npm*
COPY . /app
CMD node server.js
EXPOSE 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/