Dockerfile的注意事项
一、FROM 语法的使用
例:
FROM ubuntu:16.04
选择镜像的三个基本原则:
1、官方镜像优于非官方的镜像; 有官方认证的,直接选择官方认证的。选择官方镜像至少可以保证没有木马和侵入程序。特别是你如果已经在公司上班,保证容器的安全非常重要。
2、固定版本的Tag,而不是每都使用latest;
进入到镜像详细页面,选择Tags选项卡,会看到很多版本的镜像。需要根据项目需求进行选择,而不是不负责任的每次都选择最新版本。有些镜像的前后版本是不兼容的,这会给你的工作带来很多麻烦,比如镜像的维护性和稳定性都会存在问题。所以在写Dockfile第一步时,就需要我们做好这些事情。选择固定的版本,而不是每次都使用latest。
3、功能满足,选择体积小的镜像;
注意我们选择的是基础镜像,在这个基础上,我们还会加入很多自己的东西和应用。当我们再次build时,镜像体积就会很大,越大的镜像,代表复杂度越高。所以让自己的镜像变的简洁,是我们的责任。
二、RUN 语法使用的注意事项
(一)、错误示范:
RUN apt-get update
RUN apt-get install wget
RUN wget https://github.com/ipinfo/cli/releases/download/ipinfo-2.0.1/ipinfo_2.0.1_linux_amd64.tar.gz
RUN tar zxf ipinfo_2.0.1_linux_amd64.tar.gz
RUN mv ipinfo_2.0.1_linux_amd64 /usr/bin/ipinfo
RUN rm -rf ipinfo_2.0.1_linux_amd64.tar.gz
(二)、正确示范:
RUN apt-get update && \ apt-get install wget && \ wget https://github.com/ipinfo/cli/releases/download/ipinfo-2.0.1/ipinfo_2.0.1_linux_amd64.tar.gz && \ tar zxf ipinfo_2.0.1_linux_amd64.tar.gz && \ mv ipinfo_2.0.1_linux_amd64 /usr/bin/ipinfo && \ rm -rf ipinfo_2.0.1_linux_amd64.tar.gz
第一种与第二种都可以打包成image,但是第一种示例将每个命令分开RUN每一次RUN都会是一层,会增加最终打包的image文件的大小。而第二种示例用&& \的方式将多个命令放在一起只RUN一次,会控制最终得到的image大小。我们制作image要尽可能的使它小一点。
三、COPY命令与ADD命令
(一)COPY命令例:
hello-world.py /home/hello-world.py
(二)ADD命令例:
hello-world.tar /home/
COPY命令与ADD命令都是将文件添加进image里。在复制普通文件的时候,并没有什么太大的不同,两个命令都可以把本地文件,复制到镜像里(如果复制的路径不存在,则会自动创建)。但是ADD命令在添加gzip文件的时候,可以自动解压gzip文件。
四、WORKDIR切换工作目录命令
WORKDIR命令类似于Linux下的cd命令。
例:
WORKDIR /home
ADD hello-world.tar hello-world.py
五、ARG命令与ENV命令
这两个命令都可以用来设置一个变量,所以这两个命令在Dockerfile里经常被搞混淆。但是这两个命令还是有些细节的不同。
ARG命令与ENV命令的不同 ARG命令和ENV命令有两点不同,第一点是声明变量的作用域不同,第二点是ARG声明后,可以在构建时修改变量。
六、CMD容器启动命令
当设置好基础环境,安装完对应软件,处理完文件后。有时候需要启动某个默认命令。CMD用来设置容器启动时默认会执行的命令。
CMD命令的三个基本特性: 1、容器启动时默认执行的命令 2、如果docker container run启动容器时指定了其它命令,则CMD命令会被忽略 3、如果定义多个CMD,只有最后一个CMD执行
例:
CMD ["vim","version"]