Skip to content

编写 Dockerfile

原文:https://docs.docker.com/guides/docker-concepts/building-images/writing-a-dockerfile/

解释

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

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

dockerfile
FROM python:3.12
WORKDIR /usr/local/app

# 安装应用程序依赖
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

# 复制源代码
COPY src ./src
EXPOSE 5000

# 设置一个应用用户,使容器不以root用户运行
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. 配置最终镜像

在这个快速动手指南中,你将编写一个 Dockerfile,构建一个简单的 Node.js 应用程序。如果你不熟悉基于 JavaScript 的应用程序,不用担心。跟随本指南不需要这些知识。

设置

下载这个 ZIP 文件并将内容解压到你的机器上的一个目录中。

创建 Dockerfile

现在你已经有了项目,你准备创建Dockerfile

  1. 下载并安装 Docker 桌面版。

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

    Dockerfile 文件扩展名

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

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

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

    dockerfile
    WORKDIR /usr/local/app
  5. 使用COPY指令将你机器上的项目文件全部复制到容器镜像中:

    dockerfile
    COPY . .
  6. 使用yarn命令行工具和包管理器安装应用的依赖。为此,使用RUN指令运行命令:

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

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

    至此,你应该拥有以下 Dockerfile:

    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 的信息,请访问以下资源: