前言
当今容器技术已经成为了现代应用程序开发和部署的重要工具,Docker 作为当前最受欢迎的容器平台之一,提供了高效、轻量级的容器解决方案。而 Dockerfile,则是定义 Docker 容器镜像构建过程的文件,它包含了所有构建该镜像所需的指令及其参数。在本文中,我们将详细介绍 Dockerfile 中所有常见指令,以 centos7.9 镜像为例,并给出了相应的操作案例。
文章目录
指令 | 说明 |
---|---|
FROM | 指明当前的镜像基于哪个镜像构建 |
ARG | 定义构建镜像过程中使用的变量 |
LABEL | 标记镜像信息,添加元数据 |
EXPOSE | 通知 Docker 容器在运行时监听指定的网络端口 |
ENV | 指定环境变量 |
ENTRYPOINT | 指定镜像的默认入口命令 |
VOLUME | 创建一个数据卷挂载点 |
USER | 指定运行容器时的用户名或 UID |
WORKDIR | 配置工作目录 |
RUN | 运行指定命令 |
CMD | 启动容器时指定默认执行的命令 |
ADD | 添加内容到镜像 |
COPY | 复制内容到镜像 |
ONBUILD | 创建子镜像时指定自动执行的操作指令 |
STOPSIGNAL | 指定退出的信号值 |
HEALTHCHECK | 配置启动容器如何进行健康检查 |
SHELL | 指定默认 shell 类型 |
一、配置指令
1.1、ARG
ARG 指令用于设置构建参数,在构建时可以通过 --build-arg 参数传递值。例如:
ARG VERSION=7.9.2009
FROM centos:${VERSION}
1.2、FROM
FROM 指令指定了所需要用到的基础镜像,指定构建该镜像所依赖的运行环境。例如:
FROM centos:7.9.2009
此指令需要在 Dockerfile 的开始处进行定义,并且只能被定义一次
1.3、LABEL
LABEL 指令用于设置镜像的作者和相关说明信息。其中,Maintainer 是一个特殊的标签,用于设置镜像的维护者信息(已废弃)。
例如:
LABEL maintainer="John Doe <john@doe.com>"
LABEL version="1.0"
LABEL description="This is a CentOS 7.9.2009 base image."
1.4、EXPOSE
EXPOSE 指令用于指定容器监听的网络端口号(一个或多个端口),但并不会将该端口暴露到宿主机环境,不能用于容器端口的绑定和映射。
例如:
EXPOSE 80/tcp
EXPOSE 443/tcp
1.5、ENV
ENV 指令用于定义环境变量(也可以直接通过 --env 参数在运行容器时传递环境变量)。环境变量可在容器内部通过 $VARIABLE_NAME 使用。
例如:
ENV HTTP_PROXY=http://proxy.example.com:8080/
ENV HTTPS_PROXY=https://proxy.example.com:
1.6、ENTRYPOINT
ENTRYPOINT 指令指定容器启动时要执行的命令。与CMD类似,但是 CMD 会在 ENTRYPOINT 声明的命令之后执行。
例如:
ENTRYPOINT ["/usr/sbin/nginx"]
1.7、VOLUME
VOLUME 指令声明了数据卷需要挂载到容器中,与宿主机上的一个目录相对应。
例如:
VOLUME ["/data", "/var/lib/mysql"]
1.8、USER
USER 指令设置运行容器时的用户账户信息。
例如:
USER appuser
1.9、WORKDIR
WORKDIR 指令设置了工作目录,即 RUN, CMD, ENTRYPOINT, COPY, ADD等指令执行时的默认路径。
例如:
WORKDIR /home/app/
1.10、ONBUILD
ONBUILD:定义触发器指令,在当前镜像被用于构建下一级镜像时被触发执行。
例如:
ONBUILD COPY conf/ /usr/local/nginx/conf/
ONBUILD RUN chown -R nginx.nginx /usr/local/nginx/conf/
1.11、STOPSIGNAL
STOPSIGNAL:设置容器停止信号。默认为 SIGTERM。
例如:
STOPSIGNAL SIGINT
1.12、HEALTHCHECK
HEALTHCHECK:健康检查指令,用于确定容器是否在正常工作。
例如:
HEALTHCHECK --interval=5s --timeout=3s CMD curl -f http://localhost/ || exit 1
1.13、SHELL
SHELL指定 SHELL 程序的路径或类型。
例如:
SHELL ["/bin/bash", "-c"]
二、操作指令
2.1、RUN
RUN 指令用于在容器内执行命令,这些命令将在构建期间被执行。
例如:
RUN yum -y update && \
yum install -y nginx
2.2、CMD
CMD 指令指定容器启动后默认执行的命令。如果在 docker run 启动时提供了命令,则会覆盖 CMD 中的命令。
该指令定义了默认的命令或参数,当以交互方式启动容器时运行。Dockerfile 中只能有一个 CMD
例如:
CMD ["/usr/sbin/nginx","-g","daemon off;"]
2.3、ADD
ADD 指令与 COPY 相似,但它比 COPY 更强大。除了支持将本地文件复制到 Docker 镜像外,它还可以解压缩 tar 文件、下载远程 URL 并自动解压缩等多种操作。
例如:
ADD http://example.com/big.tar.xz /usr/src/things/
ADD test.tar.gz /tmp
2.4、COPY
该指令允许将文件从主机复制到容器内部。
例如:
COPY src /app/src
COPY my.cnf /etc/mysql/my.cnf
COPY target/*.jar /app.jar
其中,src 是我们要复制的主机源目录,/app/src 指容器内的目标路径,my.cnf 和 *.jar 同理。
在第一个例子中,我们使用 ADD 下载并提取了一份压缩过的文件。在第二个例子中,我们添加了另一个本地存档文件。
三、整体Dockerfile介绍
其中,每个指令都有对应的语法和用法。下面我们通过一个基于 CentOS 7.9 镜像的示例来介绍各个指令的具体操作方法。
我们首先来构建一个简单的 HTTP 服务的镜像:
# 使用 Centos 7.9 作为基础镜像
FROM centos:7.9.2009
# 指定作者和相关镜像说明信息
LABEL maintainer="John Doe <john@doe.com>"
LABEL description="A basic HTTP service image"
# 定义构建参数APP_ROOT,并设置其值为 /app
ARG APP_ROOT=/app
# 设置环境变量,分别设置环境变量 APP_ROOT、LANG 和 PATH,以便后续操作可以访问到这些环境变量
ENV APP_ROOT ${APP_ROOT}
ENV LANG zh_CN.utf8
ENV PATH $APP_ROOT/bin:$PATH
# 创建工作目录,将工作目录切换到 APP_ROOT 环境变量所指定的路径,即 /app
WORKDIR $APP_ROOT
# 暴露端口 80
EXPOSE 80/tcp
# 添加文件到容器中,将当前目录下的 index.html 文件添加到容器中的 APP_ROOT 目录下
ADD index.html $APP_ROOT/
# 运行脚本文件,定义容器启动时默认运行的命令为以后台方式运行 python 内置的 HTTP 服务器,监听在容器的 80 端口上
CMD ["sh", "-c", "python -m http.server 80"]
总结
- FROM:指定使用的基础镜像,格式为 FROM [:]。
- RUN:在当前镜像中执行命令(例如安装软件包),格式为 RUN 。
- CMD:定义默认的容器启动命令,格式为 CMD [“executable”, “param1”, “param2”]或者CMD command param1 param2。
- ENTRYPOINT:与 CMD 相似,但会将参数传递给 ENTRYPOINT 而不是运行时才调用命令。
- ADD/COPY:将本地文件添加到镜像中,格式为 ADD/COPY … 。其中 ADD 支持 url 解压缩等操作。
- ENV:设置环境变量,格式为 ENV 。
- ARG:定义构建参数,格式为 ARG [=]。
- EXPOSE:声明容器打算监听的端口,格式为 EXPOSE [ …]。
- WORKDIR:设置工作目录路径,格式为 WORKDIR /path/to/workdir。
- VOLUME:在容器中创建一个挂载点,方便在宿主机上保存数据,格式为 VOLUME /path/to/volume。
以上是常用的一些 Dockerfile 指令,可以根据需要选取使用。总体而言,Dockerfile 的编写灵活性较高,能够满足不同场景的需求。