编写 Dockerfile
原文:https://docs.docker.com/guides/docker-concepts/building-images/writing-a-dockerfile/
解释
Dockerfile 是一种基于文本的文档,用于创建容器镜像。它为镜像构建器提供指令,包括运行的命令、复制的文件、启动命令等。
例如,以下 Dockerfile 将生成一个可运行的 Python 应用程序:
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 通常遵循以下步骤:
- 确定你的基础镜像
- 安装应用依赖
- 复制任何相关的源代码和/或二进制文件
- 配置最终镜像
在这个快速动手指南中,你将编写一个 Dockerfile,构建一个简单的 Node.js 应用程序。如果你不熟悉基于 JavaScript 的应用程序,不用担心。跟随本指南不需要这些知识。
设置
下载这个 ZIP 文件并将内容解压到你的机器上的一个目录中。
创建 Dockerfile
现在你已经有了项目,你准备创建Dockerfile
。
下载并安装 Docker 桌面版。
在与文件
package.json
相同的文件夹中创建一个名为Dockerfile
的文件。Dockerfile 文件扩展名
重要的是要注意,
Dockerfile
没有文件扩展名。有些编辑器 会自动为文件添加扩展名(或抱怨它没有扩展名)。在
Dockerfile
中,通过添加以下行定义你的基础镜像:dockerfileFROM node:20-alpine
现在,使用
WORKDIR
指令定义工作目录。这将指定将来命令运行的位置和文件被复制到容器镜像内的目录。dockerfileWORKDIR /usr/local/app
使用
COPY
指令将你机器上的项目文件全部复制到容器镜像中:dockerfileCOPY . .
使用
yarn
命令行工具和包管理器安装应用的依赖。为此,使用RUN
指令运行命令:dockerfileRUN yarn install --production
最后,使用
CMD
指令指定默认运行的命令:dockerfileCMD ["node", "./src/index.js"]
至此,你应该拥有以下 Dockerfile:
dockerfileFROM 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 的信息,请访问以下资源: