编写 Dockerfile

说明

Dockerfile 是一个基于文本的文档,用于创建容器镜像。它为镜像构建器提供指令,说明要运行的命令、要复制的文件、启动命令等等。

例如,以下 Dockerfile 将生成一个可运行的 Python 应用程序

FROM python:3.12
WORKDIR /usr/local/app

# Install the application dependencies
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

# Copy in the source code
COPY src ./src
EXPOSE 5000

# Setup an app user so the container doesn't run as the root user
RUN useradd app
USER app

CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8080"]

常用指令

Dockerfile 中一些最常用的指令包括:

  • FROM <image> - 指定构建将扩展的基础镜像。
  • WORKDIR <path> - 指定“工作目录”或镜像中复制文件和执行命令的路径。
  • COPY <host-path> <image-path> - 指示构建器从主机复制文件并将它们放入容器镜像中。
  • RUN <command> - 指示构建器运行指定的命令。
  • ENV <name> <value> - 设置运行容器将使用的环境变量。
  • EXPOSE <port-number> - 设置镜像的配置,指示镜像想要公开的端口。
  • USER <user-or-uid> - 设置所有后续指令的默认用户。
  • CMD ["<command>", "<arg1>"] - 设置使用此镜像的容器将运行的默认命令。

要阅读所有指令或了解更多详细信息,请查看 Dockerfile 参考

试一试

正如您在前面的示例中看到的那样,Dockerfile 通常遵循以下步骤:

  1. 确定您的基础镜像
  2. 安装应用程序依赖项
  3. 复制所有相关的源代码和/或二进制文件
  4. 配置最终镜像

在本快速实践指南中,您将编写一个构建简单的 Node.js 应用程序的 Dockerfile。如果您不熟悉基于 JavaScript 的应用程序,请不要担心。遵循本指南不需要了解它。

设置

下载此 ZIP 文件 并将其内容解压缩到您机器上的目录中。

创建 Dockerfile

现在您已经拥有了项目,您可以创建 Dockerfile 了。

  1. 下载并安装 Docker Desktop。

  2. 在与 package.json 文件相同的文件夹中创建一个名为 Dockerfile 的文件。

    Dockerfile 文件扩展名

    需要注意的是,Dockerfile _没有_ 文件扩展名。某些编辑器会自动向文件添加扩展名(或抱怨它没有扩展名)。

  3. Dockerfile 中,通过添加以下行来定义您的基础镜像:

    FROM node:20-alpine
  4. 现在,使用 WORKDIR 指令定义工作目录。这将指定将来命令将在哪里运行以及文件将在容器镜像内复制到的目录。

    WORKDIR /app
  5. 使用 COPY 指令将您机器上项目中的所有文件复制到容器镜像中:

    COPY . .
  6. 使用 yarn CLI 和包管理器安装应用程序的依赖项。为此,请使用 RUN 指令运行命令:

    RUN yarn install --production
  7. 最后,使用 CMD 指令指定要运行的默认命令:

    CMD ["node", "./src/index.js"]

    这样,您应该拥有以下 Dockerfile:

    FROM node:20-alpine
    WORKDIR /app
    COPY . .
    RUN yarn install --production
    CMD ["node", "./src/index.js"]

此 Dockerfile 尚未准备好用于生产环境

需要注意的是,此 Dockerfile _尚未_ 遵循所有最佳实践(出于设计考虑)。它将构建应用程序,但构建速度不会像它可能的那样快,或者镜像不会像它可能的那样安全。

继续阅读以了解如何使镜像最大限度地利用构建缓存、以非 root 用户身份运行以及多阶段构建。

使用 docker init 快速容器化新项目

docker init 命令将分析您的项目并快速创建一个 Dockerfile、一个 compose.yaml 和一个 .dockerignore,帮助您快速上手。由于您在这里专门学习 Dockerfile,因此现在不会使用它。但是,在此处了解更多信息

附加资源

要了解有关编写 Dockerfile 的更多信息,请访问以下资源:

下一步

现在您已经创建了一个 Dockerfile 并学习了基础知识,是时候学习构建、标记和推送镜像了。