一、dockerfile基本结构
最简单的理解就是dockerfile实际上是一些命令的堆叠,有点像最基础的shell脚本,没有if 没有for,就是串行的一堆命令。
一般而言,dockerfile分为四个部分:基础镜像信息、维护者信息、镜像操作指令和启动时执行指令,例如:
#基础镜像信息
FROM ubuntu
#维护者信息
MAINTAINER slim_liu slim_liu@163.com
#镜像操作指令
RUN apt-get update && apt-get install -u nginx
#启动容器时执行的指令
CMD/usr/sbin/nginx
二、镜像操作指令
指令分为很多种,下面一一列举:
指令一般格式为 INSTRUCTION arguments ,指令包括FROM、MAINTAINER、RUN 等。
2.1 FROM
格式:
FROM 或FROM :
Dockerfile 的开头,必须是FROM,如果在同一个dockerfile中创建多个镜像,可以使用多个from,每个镜像一次。
2.2 MAINTAINER
格式:
MANINTAINER ,指定维护者信息
2.3 RUN
格式:
RUN 或RUN ["executable", "param1", "param2"]
前者将在shell终端中执行命令,即 /bin/sh -c。后者则使用exec执行,指定终端,可以使用第二种,RUN ["/bin/bash", "-c" , "echo hello!"]
2.4 CMD
CMD支持三种格式:
CMD ["executable", "param1", "param2"]#使用exec执行,推荐方式。
CMD command param1 param2 #在/bin/sh 中执行,提供给需要交互的应用。
CMD ["param1", "param2"] #提供给ENTRYPOINT 的默认参数。
每个dockerfile只能指定一条CMD指令,如果有多条,则只会执行最后一条,并且如果启动容器时,指定了运行的命令,则会覆盖掉CMD指定的命令。
2.5 EXPOSE
格式:
EXPOSE ...
例:
EXPOSE 80 443 3306
告诉docker容器暴露的端口号,供互联系统使用。在启动容器时,需要通过-P,docker主机会自动分配一个端口转发到指定的端口,如果使用-p,则可以具体的指定端口映射关系。
2.6 ENV
格式:
ENV #指定一个环境变量,会被后续的RUN变量使用,并且会在容器中保持。
例:
ENV A1RUN curl-SL http://test.com/temp-$A.tar.gz
2.7 ADD
格式:
ADD
复制指定的src到容器中的dest,src可以是dockerfile相对路径的目录、url、tar文件(将自动解压成目录)等
2.8 COPY
格式:
COPY
复制本地主机的src(为dockerfile所在目录的相对路径,文件或目录)为容器中的dest,目标路径不存在时,会自动创建,当使用本地目录为源目录时,推荐使用COPY。
2.9 ENTRYPOINT
格式1:
ENTRYPOINT ["executable", "param1", "param2"]
格式2:
ENTRYPOINT command param1 param2 (#shell中执行)
配置容器启动时执行的命令,并且不能被docker run 提供的参数覆盖。
每个dockerfile只能有一个此参数,多个时候,只有最后一个生效。
2.10 VOLUME
格式:
VOLUME
创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
2.11 USER
格式:
USER daemon
指定运行容器时的用户名或UID,后续的RUN命令也会使用指定用户。
当容器不需要管理员权限时,建议添加USER参数,例如:
RUN groupadd -r postgres && useradd -r -g postgres postgres #需要临时获取管理员权限,可以使用gosu,不推荐sudo。
2.12 WORKERDIR
格式:
WORKERDIR /path/workerdir
为后续的RUN CMD ENTRYPOINT等指令配置工作目录。
可以使用多个WORKERDIR,如果后续的参数是相对路径,将基于之前的WORKERDIR
例:
WORKERDIR /a
WORKERDIR b
WORKERDIR c
RUN pwd/a/b/c
2.13 ONBUILD
格式:
ONBUILD [INSTRUCTION]
配置当所创建的镜像作为其他新创建镜像的基础镜像时,所执行的操作指令。
例:
我们首先创建了image-a,并在其中使用了ONBUILD
[...]
ONBUILD ADD ./src/ONBUILD RUN/usr/local/bin/python-build --dir /app/src
[...]
接着我们from image-a创建image-b,就会自动执行上面的两句。
如果使用ONBUILD指令的镜像,推荐在标签中注明,例如,ruby:1.9-onbuild