DockerFile文件详解
概述
Dockerfile 是一个文本文件,里面包含组装新镜像时用到的基础镜像和各种指令。
使用 dockerfile 文件来定义镜像,然后运行镜像,启动容器。
基本结构
一个dockerfile文件包含以下部分:
- 基础镜像信息: 使用 FROM 关键字指定基础镜像信息,FROM 是 dockerfile 文件的第一条指令。
- 维护者信息: 使用 MAINTAINER 关键字指定,通常可以使用 dockerfile 文件创建者的名字或者邮件作为维护者的信息。
- 镜像操作指令: 每执行一条镜像操作指令,都会在镜像中添加新的一层。如 RUN,CMD,FROM,EXPOSE,ENV 等指令。
- 容器启动执行命令: 用户指定在启动容器时需要执行的命令,通过:CMD ENTRYPOINT 指定。
常用指令
FROM 指定基础镜像
FROM 指令用于指定其后构建新镜像所使用的基础镜像。FROM 指令必是 Dockerfile 文件中的首条命令,启动构建流程后,Docker 将会基于该镜像构建新镜像,FROM 后的命令也会基于这个基础镜像。
格式:
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
示例:
FROM mysql:5.6
注:
tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
通过 FROM 指定的镜像,可以是任何有效的基础镜像。FROM 有以下限制:
- FROM 必须 是 Dockerfile 中第一条非注释命令
- 在一个 Dockerfile 文件中创建多个镜像时,FROM 可以多次出现。只需在每个新命令 FROM 之前,记录提交上次的镜像 ID
- tag 或 digest 是可选的,如果不使用这两个值时,会使用 latest 版本的基础镜像
MAINTAINER 维护者信息
格式:
MAINTAINER <name>
示例:
MAINTAINER Jasper Xu
MAINTAINER sorex@163.com
MAINTAINER Jasper Xu <sorex@163.com>
WORKDIR 指定工作目录
WORKDIR用于在容器内设置一个工作目录:
格式:
WORKDIR /path/to/workdir
示例:
WORKDIR /opt/infosec/NetCertCA_6
RUN 执行命令
在镜像的构建过程中执行特定的命令,并生成一个中间镜像。
shell执行
格式:
RUN <command>
exec执行
格式:
RUN ["executable", "param1", "param2"]
示例:
RUN ["executable", "param1", "param2"]
RUN apk update
RUN ["/etc/execfile", "arg1", "arg1"]
COPY 复制文件
格式:
COPY <源路径> <目标路径>
示例:
COPY package.json /usr/src/app/
ADD 复制文件并解压
ADD 指令和 COPY 的格式和性质基本一致。在 Docker 官方的 Dockerfile 最佳实践文档 中要求,尽可能的使用 COPY,因为 COPY 的语义很明确,就是复制文件而已,而 ADD 则包含了更复杂的功能,其行为也不一定很清晰。最适合使用 ADD 的场合,就是所提及的需要自动解压缩的场合。
另外需要注意的是,ADD 指令会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。
因此在 COPY 和 ADD 指令中选择的时候,可以遵循这样的原则,所有的文件复制均使用 COPY 指令,仅在需要自动解压缩的场合使用 ADD。
格式:
ADD <源路径> <目标路径>
ENV 设置环境变量
这个指令很简单,就是设置环境变量而已。
格式:
ENV <key><value>
ENV <key1>=<value1><key2>=<value2>...
示例:
ENV JAVA_HOME /usr/local/jdk1.8
ENV PATH $PATH:$JAVA_HOME/bin
EXPOSE 设置监听端口
格式:
EXPOSE <port> [<port>...]
EXPOSE 指令并不会让容器监听 host 的端口,如果需要,需要在 docker run 时使用 -p 参数来发布容器端口到 host 的某个端口上。
CMD 容器启动命令
CMD用于指定在容器启动时所要执行的命令。
格式:
CMD ["executable","param1","param2"] (执行可执行文件,优先)
CMD command param1 param2 (执行shell内部命令)
示例:
CMD echo "This is a test." | wc -
CMD ["/usr/bin/wc","--help"]
注:
CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
注意 与 RUN 指令的区别:RUN 在构建的时候执行,并生成一个新的镜像,CMD 在容器运行的时候执行,在构建时不进行任何操作。
构建一个简单 nginx 镜像
在本地创建一个文件名为Dockerfile的文件
# This is my first dockerfile.
# Version 1.0
# 指定基础镜像
FROM centos:7.9:2009
# 维护者信息
MAINTAINER magicboy
# 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH
# 文件放在当前目录下,拷过去会自动解压
ADD nginx-1.8.0.tar.gz /usr/local/
ADD epel-release-latest-7.noarch.rpm /usr/local/
# 执行以下命令
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www
# 相当于cd
WORKDIR /usr/local/nginx-1.8.0
RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install
RUN echo "daemon off;" >> /etc/nginx.conf
#EXPOSE 映射端口
EXPOSE 80
#CMD 运行以下命令
CMD ["nginx"]
构建镜像
docker build -t nginx:v1.0 ./