编写 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. 复制任何相关的源代码和/或Binaries
  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,帮助您 快速上手。由于您在这里专门学习 Dockerfiles, 您现在不会使用它。但是, 在此处了解更多信息

其他资源

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

后续步骤

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