Docker中Dockerfile的使用
实际环境中,项目所需要的容器可能没有很符合的公共镜像,就需要在公共镜像的基础上重新构建镜像,除了可以从容器中用docker commit命令创建,还可以使用Dockerfile文件来直接定制镜像
1、使用Dockerfile定制镜像
-
举例定制一个简单的镜像,新建一个名为Dockerfile的文件,并在文件内添加以下内容:
FROM nginx MAINTAINER cuckoo RUN echo '这是一个本地构建的test镜像' > /usr/share/nginx/html/index.html
-
基础说明
FROM:定制的镜像基本基于公共镜像的基础上,这里就是用FROM来下载公共镜像nginx,后续的操作就是在这个镜像的基础上进行修改
RUN:用于执行后面的命令,常用的有两种:一个就是直接接shell命令,另一个是接可执行文件,可包含参数传递,如RUN ./test.py parameter1 paramter2
[NOTE]
Dockerfile的指令每执行一次都会在docker上新建一层,所以过多的命令就会有过多的无意义的层,容易造成镜像膨胀过大,在写法上可以进行优化,如下这样以&&
符号链接命令,这样执行后,只会创建一层镜像。FROM centos RUN yum install wget RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" RUN tar -xvf redis.tar.gz 以上执行会创建 3 层镜像。可简化为以下格式: FROM centos RUN yum install wget \ && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \ && tar -xvf redis.tar.gz
-
开始构建
在Dockerfile所有的目录执行docker build -t nginx:v1
,即构建一个nginx:v1的镜像[NOTE]
实际上更多的是配合docker-compose.yml一起使用~
2、常用命令说明
-
COPY,复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
格式:
COPY [--chown=<user>:<group>] <源路径1>... <目标路径>
[NOTE]
[--chown=: ]:可选参数,用户改变复制到容器内文件的拥有者和属组。
<源路径>:源文件或者源目录。
<目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。 -
ADD
和COPY的使用格式一致(同样需求下,官方推荐使用 COPY),在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。具体是否使用,可以根据是否需要自动解压来决定。 -
CMD
为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。类似于 RUN 指令,但二者运行的时间点不同:- CMD 在docker run 时运行。
- RUN 是在 docker build。
格式:
CMD <shell 命令>
CMD ["<可执行文件或命令>","<param1>","<param2>",...]
CMD ["<param1>","<param2>",...]
推荐使用第二种格式,执行过程比较明确。[NOTE]
更多的情况是关于容器运行时的命令会写在docker-compose.yml,Dockerfile就用来执行build需要的命令,与CMD指令类似的还有ENTRYPOINT指令。 -
ENV
设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。
格式:
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
如:ENV JAVA_HOME /usr/java/jdk1.8.0_202-amd64
-
WORKDIR
指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在,WORKDIR 指定的工作目录,必须是提前创建好的。
格式:
WORKDIR <工作目录路径>
-
USER
用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户,用户和用户组必须提前已经存在。
格式:
USER <用户名>[:<用户组>]