Dockerfile 常用指令
Dockerfile 作为构建镜像的常见方式,其相关命令便显得尤为重要。
Dockerfile通过文本文件构建镜像,文本内包含了一条条构建镜像所需的指令和说明。
1. FROM
语法: FROM <image>:<tag>
例: FROM centos:7
指明新镜像来源的基础镜像,如果没有选择tag,默认为 latest。
如果以空镜像为模板,则 :FROM scratch 。
2. MAINTAINER (deprecated)
语法: MAINTAINER <name>
例:MAINTAINER xxxx <xxxx@126.com>
指明镜像的作者及联系方式,已过时。推荐使用 LABEL。
3. LABEL
语法: LABEL <key>=<value> <key>=<value> <key>=<value> ...
例:LABEL maintainer="xxxx.com"
为镜像指定标签。也可用来指定镜像作者。
4. RUN
语法: RUN <command>
例:RUN mkdir -p /usr/local/java
构建镜像时运行的 Shell 命令,
比如构建的新镜像中我们想在 /usr/local 目录下创建一个 java 目录。
5. ADD
语法: ADD <src>... <dest>
例:ADD jdk-11.0.6_linux-x64_bin.tar.gz /usr/local/java
拷贝文件或目录到镜像中。会自动下载和解压。
6. COPY
语法: COPY <src>... <dest>
例:COPY jdk-11.0.6_linux-x64_bin.tar.gz /usr/local/java
拷贝文件或目录到镜像中。用法同 ADD,只是不支持自动下载和解压。
7. EXPOSE
语法: EXPOSE <port> [<port>/<protocol>...]
例:EXPOSE 80 443 8080/tcp
暴露容器运行时的监听端口给外部,可以指定端口是监听 TCP 还是 UDP,如果未指定协议,则默认
为 TCP。
如果想使得容器与宿主机的端口有映射关系,必须在容器启动的时候加上 -P 参数。
8. ENV
语法: ENV <key> <value> 添加单个
ENV <key>=<value> ... 添加多个
例:ENV JAVA_HOME /usr/local/java/jdk-11.0.6/
设置容器内环境变量
9. CMD
语法:
CMD ["executable","param1","param2"] ,例: CMD["/usr/local/tomcat/bin/catalina.sh", "run"]
CMD ["param1","param2"] ,例: CMD [ "echo", "$JAVA_HOME" ]
CMD commandparam1 param2 ,例: CMD echo $JAVA_HOME
启动容器时执行的 Shell 命令。在 Dockerfile 中只能有一条 CMD 指令。如果设置了多条 CMD,只有最后一条 CMD 会生效。
如果创建容器的时候指定了命令,则 CMD 命令会被替代。
10. ENTRYPOINT
语法:
ENTRYPOINT ["executable", "param1", "param2"] ,例: ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh", "run"]
ENTRYPOINT command param1 param2 ,例: ENTRYPOINT ehco $JAVA_HOME
启动容器时执行的 Shell 命令,同 CMD 类似,不会被 docker run 命令行指定的参数所覆盖。在Dockerfile 中只能有一条 ENTRYPOINT 指令。如果设置了多条 ENTRYPOINT,只有最后一条 ENTRYPOINT会生效。
如果在 Dockerfile 中同时写了 ENTRYPOINT 和 CMD,并且 CMD 指令不是一个完整的可执行命令,那么 CMD 指定的内容将会作为 ENTRYPOINT 的参数;
如果在 Dockerfile 中同时写了 ENTRYPOINT 和 CMD,并且 CMD 是一个完整的指令,那么它两会互相覆盖,谁在最后谁生效
11. WORKDIR
语法: WORKDIR /path/to/workdir
例:WORKDIR /usr/local
为 RUN、CMD、ENTRYPOINT 以及 COPY 和 AND 设置工作目录。
12. VOLUME
# 容器的 /var/lib/mysql 目录会在运行时自动挂载为匿名卷,匿名卷在宿主机的 /var/lib/docker/volumes 目录下
VOLUME ["/var/lib/mysql"]
指定容器挂载点到宿主机自动生成的目录或其他容器。一般的使用场景为需要持久化存储数据时。
一般不会在 Dockerfile 中用到,更常见的还是在 docker run 的时候通过 -v 指定数据卷。