从镜像仓库得到Docker镜像,很多时候为了适应实际的生产环境,需要对镜像进行定制,首选方法就是编辑Dockerfile文件来Build镜像。Dockerfile文件书写有一些需要注意的地方,这篇文章给出一些书写Dockerfile文件的建议。
- 运行apt-get
为了运行自己的代码,依赖的软件包需要安装,常用包管理工具来完成,比如apt-get。为了安装软件的最新版本,“apt-get install”之前会跟上"apt-get update"。应该将这两个命令放在一个RUN 语句里面,如果使用如下代码片段:
FROM ubuntu:18.04
RUN apt-get update
RUN apt-get install -y curl
"apt-get install -y curl"命令会执行失败,因为前面的"apt-get update"引入了缓存问题
- 使用COPY代替ADD
ADD有比COPY更多的功能,比如自动解压TAR文件(当通过URL拉取文件的时候,这个功能是失效的)、从远程URL获取文件。但为了避免一些非预料的问题,还是建议用COPY,尽量少用ADD。 - 尽量不要使用 latest TAG
基镜像使用latest TAG一般没有什么问题,但是当基镜像有更新时,镜像的Build过程可能会突然中止,为了有一个稳定的构建过程,建议选择基镜像的固定版本,比如:
FROM node:6.2.1
- 不要在Dockerfile的开头使用EXPOSE和ENV
这两个语句的开销比较小,如果你破坏了为它们创建的缓存,也可以快速的重建,所以尽可能将这两个语句放到Dockerfile文件的后面,这样的话,如果你需要对EXPOSE或ENV的参数做修改,rebuild的过程也会非常快。 - 使用VOLUME
Dockerfile中的VOLUME是在运行容器时添加的,而不是在镜像构建过程时添加。
FROM busybox:1.24
VOLUME /data
RUN echo "hello-world!!!!" > /data/myfile.txt
CMD ["cat", "/data/myfile.txt"]
$ docker run volume-in-build
cat: can't open '/data/myfile.txt': No such file or directory
- 不要在一个容器中运行多个服务
在测试环境中,为了快速迭代可以这样操作,但是在生产环境中,不建议这样操作,第一是会影响容器的水平扩展,第二是因为越多的服务意味着更多的依赖,会影响镜像的构建速度,最后的弊端是这样的Dockerfile文件通常难以书写、维护和调试。
希望这篇文章对你书写Dockerfile文件有所帮助。
网友评论