您现在的位置是:首页 >学无止境 >【Docker系列】Dockerfile 中指令作用介绍网站首页学无止境

【Docker系列】Dockerfile 中指令作用介绍

搞什么滚去学习 2024-06-22 00:01:02
简介【Docker系列】Dockerfile 中指令作用介绍

前言

当今容器技术已经成为了现代应用程序开发和部署的重要工具,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 的编写灵活性较高,能够满足不同场景的需求。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。