Skip to content

Docker - 指令命令

Dockerfile 使用一组特定的指令来定义如何构建镜像。理解这些命令是创建高效且有效的 Docker 镜像的关键。

以下是一些最常用的指令:

指定构建的基础镜像。每个 Dockerfile 都必须以 FROM 指令开头(除非使用包含多条 FROM 语句的多阶段构建)。

FROM ubuntu:22.04
FROM python:3.9-slim

在构建过程中,在当前镜像之上创建一个新层并执行命令。常用于安装软件包、编译代码等。

# Shell form
RUN apt-get update && apt-get install -y curl
# Exec form (preferred for avoiding shell string munging)
RUN ["apt-get", "update"]

最佳实践:将相关的命令(例如 apt-get update 和 apt-get install)链接在一起,并在同一个 RUN 指令中使用 && 进行清理,以最小化镜像层。

为正在执行的容器提供默认值。它指定容器启动时要运行的命令。一个 Dockerfile 中只能有一个 CMD 指令。如果存在多个 CMD 指令,只有最后一个会生效。

如果您为 docker run <image> [command] 提供参数,它们将覆盖默认的 CMD。

# Exec form (preferred)
CMD ["python", "app.py"]
# Shell form
CMD echo "Default command executed"

配置容器使其以可执行文件的形式运行。它类似于 CMD,但传递给 docker run <image> [command] 的命令将作为参数附加到 ENTRYPOINT。

这对于创建行为类似于特定命令行工具的镜像非常有用。

# Exec form (preferred)
ENTRYPOINT ["redis-server"]
# Use ENTRYPOINT with CMD to provide default arguments
ENTRYPOINT ["ping"]
CMD ["localhost"]
# 运行 'docker run <image>' 会执行 'ping localhost'
# 运行 'docker run <image> google.com' 会执行 'ping google.com'

向镜像添加元数据作为键值对。对于组织、自动化、许可信息等很有用。替换了已弃用的 MAINTAINER 指令。

LABEL maintainer="Your Name <you@example.com>"
LABEL version="1.0"
LABEL description="My awesome application image"

文档化容器化应用程序在运行时监听哪些端口。它不会实际发布端口;它作为对用户的文档,并可供其他工具使用。

EXPOSE 80
EXPOSE 8080/tcp

在镜像中设置环境变量。这些变量在构建过程(定义后)以及从镜像运行容器时可用。

ENV APP_VERSION=1.1
ENV APP_HOME=/app
WORKDIR $APP_HOME # Use the variable later

将文件或目录从构建上下文(您的本地机器)复制到镜像的文件系统中。

# 复制单个文件
COPY requirements.txt /app/
# 复制整个目录
COPY src/ /app/src/

类似于 COPY,但具有额外功能,例如自动解压本地 tar 归档文件和支持 URL 作为源。最佳实践通常倾向于使用 COPY,除非您确实需要 ADD 的额外功能,因为 COPY 更透明。

ADD https://example.com/file.tar.gz /tmp/
ADD app.tar.gz /app/

设置后续 RUN, CMD, ENTRYPOINT, COPY, 和 ADD 指令在 Dockerfile 中的工作目录。如果目录不存在,它将被创建。

WORKDIR /app
COPY . .
RUN make install
CMD ["./start-app"]

设置后续命令和最终镜像运行时要使用的用户名(或 UID)以及可选的组名(或 GID)。以非 root 用户运行容器是一种安全最佳实践。

RUN groupadd -r myuser && useradd -r -g myuser myuser
# ... 复制应用程序文件并设置权限 ...
USER myuser

创建指定名称的挂载点,并将其标记为保存来自原生主机或其他容器的外部挂载卷。常用于指定持久化数据的目录(例如数据库文件)。

# 指定 /var/lib/mysql 应被作为卷管理
VOLUME /var/lib/mysql

这些是一些最常用的指令。有关完整列表和详细说明,请参阅官方 Dockerfile 参考。