Skip to main content

常用指令

最新 Dockerfile 指令见官方文档

FROM

FROM指令用于指定用作基础的Docker镜像,后续的指令都会在该镜像的基础上进行构建。例如:

  • FROM ubuntu:latest表示以最新版的Ubuntu作为基础镜像。

MAINTAINER(已弃用) / LABEL

MAINTAINER指令用于设置镜像的作者信息,但在Docker 1.13版本后已被LABEL指令取代, LABEL指令用于设置镜像的元数据,包括作者、版本、描述等。例如:

  • LABEL maintainer="John Doe <john.doe@example.com>"
  • LABEL version="1.0" description="This is a custom Docker image."

RUN

RUN指令用于在Docker镜像构建过程中执行命令,常用于安装软件包、更新系统等。例如:

  • RUN apt-get update && apt-get install -y some-package表示在镜像中执行更新和安装软件包的命令。

CMD

CMD指令用于定义容器启动后默认要执行的命令,每个Dockerfile只能有一个CMD指令,如果有多个, 则只有最后一个CMD指令会生效。例如:

  • CMD ["python", "app.py"]表示容器启动后会执行python app.py命令。

ENTRYPOINT

ENTRYPOINT指令用于设置容器启动时要执行的命令或程序,与CMD不同的是,使用ENTRYPOINT定义的命令不会被覆盖, 而是作为主要执行的命令。例如:

  • ENTRYPOINT ["python", "app.py"]表示容器启动后会执行python app.py命令。

EXPOSE

EXPOSE指令用于声明容器在运行时会监听的端口号,但并不会自动将主机的端口映射到容器的端口。例如:

  • EXPOSE 80表示容器会监听80端口。

ENV

ENV指令用于设置环境变量,这些变量可以在容器内的其他指令中使用。例如:

  • ENV MY_VAR=my_value表示设置了名为MY_VAR的环境变量,其值为my_value。

ADD / COPY

ADD指令和COPY指令都用于将主机中的文件复制到容器内部,但ADD指令支持更多功能, 比如远程URL的文件下载和自动解压缩。一般情况下,COPY更常用。例如:

  • COPY app.py /app/表示将主机中的app.py文件复制到容器内的/app/目录。

VOLUME

VOLUME指令用于声明容器中用于存储持久化数据的挂载点,可以将主机的目录或者其他容器的数据卷挂载到这个点上。例如:

  • VOLUME /data表示在容器内创建一个挂载点/data。

WORKDIR

WORKDIR指令用于设置容器中的工作目录,类似于cd命令。当在容器内执行命令时,会在工作目录下进行。例如:

  • WORKDIR /app表示将容器的工作目录设置为/app。

USER

USER指令用于设置容器中执行命令的用户。通常用于指定非root用户来运行容器中的应用程序,增加容器的安全性。例如:

  • USER nobody表示在容器中以nobody用户身份执行命令。

ARG

ARG指令用于定义构建时可传递给镜像的参数,构建时通过--build-arg选项传递参数。它允许在构建过程中灵活地传递变量值。例如:

  • ARG VERSION=latest表示定义了一个名为VERSION的参数,默认值为latest。

ONBUILD

ONBUILD指令用于定义一个触发器,当这个镜像被用作其他镜像的基础镜像时,触发器中的命令将被延迟执行。例如:

  • ONBUILD ADD . /app表示当当前镜像被用作其他镜像的基础镜像时,将会复制当前目录的所有文件到/app目录。

这也意味着在构建一个基础镜像时,ONBUILD指令中的命令不会立即执行,而是在其他镜像以该基础镜像为基础进行构建时执行。

使用ONBUILD指令可以将一些通用的操作和配置放在基础镜像中,这些操作和配置在构建派生镜像时可以被重复使用,从而简化派生镜像的构建过程。ONBUILD通常用于创建通用的模板镜像,让其他开发人员或团队在这个基础镜像上构建自己的应用镜像。

下面是一个使用ONBUILD指令的示例:

假设我们有一个简单的Python应用,目录结构如下:

my_app/
|-- Dockerfile
|-- app.py
|-- requirements.txt

首先,我们创建一个基础镜像,用于运行Python应用,并且在这个基础镜像中使用ONBUILD指令。基础镜像的Dockerfile如下:

# 基于Python官方镜像作为基础镜像
FROM python:3.9-slim

# 设置工作目录
WORKDIR /app

# 定义ONBUILD触发的操作
ONBUILD COPY requirements.txt .
ONBUILD RUN pip install --no-cache-dir -r requirements.txt
ONBUILD COPY app.py .

# 定义默认执行命令
CMD ["python", "app.py"]

然后,我们可以使用上述基础镜像来创建一个派生镜像,并在派生镜像中只需提供自己的应用代码。派生镜像的Dockerfile如下:

# 使用上述基础镜像作为基础镜像
FROM my_base_image

# 复制自己的应用代码到容器中
COPY my_app_code /app

# 定义自己的应用执行命令
CMD ["python", "my_app_code.py"]

在上面的派生镜像中,我们没有再包含安装依赖和复制app.py文件的步骤。这是因为在基础镜像中的ONBUILD指令已经包含了这些操作。当构建派生镜像时,基础镜像中的ONBUILD指令会被执行,安装依赖并将app.py文件复制到派生镜像中。

这样,我们就可以通过简单地构建派生镜像来创建一个包含自己应用代码的完整镜像,而不需要重复基础镜像中的操作。这样的模板镜像在团队协作和复用镜像时非常有用。