Dockerfile简介
Dockerfile的文件名应为“dockerfile”或“Dockerfile”,无任何后缀名。其他文件名docker无法识别为标准的Dockerfile。
Dockerfile一般由多条指令构成,下面将按指令的编写顺序(当然也是执行顺序)进行介绍。
另外,Dockerfile与Python一样,将“#”开头语句视为注释信息
FROM
用于指明要构造的镜像是否基于某个已有镜像:
FROM 镜像名:版本号
这个基础镜像可以是本地已有的,也可以是仓库中已有的。Docker在构造镜像时,若依赖的基础镜像不在本地,会自动pull过来。
如果不依赖任何已有镜像构造,则:
FROM scratch
MAINTAINER
用来声明镜像作者及其联系方式,可省略。
MAINTAINER 作者名 联系方式
WORKDIR
在容器内设置一个工作目录,之后Dockerfile中的镜像操作指令均会在该目录下执行:
WORKDIR path
COPY
在使用docker build
指令时会指令非Dockerfile文件的位置,COPY
指令用于将这些文件复制到指定目录中(一般是复制到WORKDIR
指定的工作目录里)。
COPY 文件名 path
ADD
和COPY
指令类似,但在复制tar等压缩包时还会顺手帮你解压。该指令还可对链接进行操作,先下载链接对应的文件再进行复制。
ADD 文件名 path
ENV
为基于该镜像的容器设置环境变量,容器内任何程序均可调用。
ENV key value
ENV key1=value1, key2=value2
RUN
镜像构建过程中执行的命令,一般用此类命令为容器内的容器安装依赖项。
RUN 命令
RUN的指令格式有两种,一种为Shell格式(与Linux命令一致),另一种为Exec格式,后面的CMD
与ENTRYPOINT
也都支持这两种格式的命令。
Shell格式举例:
RUN apt-get install python3
CMD echo "Hello world"
Exec格式:
RUN ["executable", "param1", "param2", ...]
# 举例:
RUN ["apt-get", "install", "python3"]
CMD ["/bin/echo", "Hello world"]
CMD
CMD
指令并不会在构建镜像时执行,该指令仅在基于该镜像的容器启动时执行。
Dockerfile中可编写多条CMD
指令,但只有最后一条实际生效。另外,若使用docker run
启动容器时指定了命令,则CMD
指令会被忽略。
ENTRYPOINT
与CMD功能一样,Dockerfile中多条ENTRYPOINT
存在的话只会执行最后一条。与CMD
不同的是,ENTRYPOINT命令不会被docker run
顶替。