Dockerfile的注意事项

140 阅读3分钟

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"]