Dockerfile 概述
Dockerfile 文件
这一切都始于 Dockerfile。
Docker 通过读取 Dockerfile 中的说明来构建镜像。一个 Dockerfile 是一个文本文件,其中包含构建源的说明 法典。Dockerfile 指令语法由规范定义 Dockerfile 引用中的 reference。
以下是最常见的说明类型:
指令 | 描述 |
---|---|
FROM <image> | 定义镜像的基础。 |
RUN <command> | 在当前镜像之上的新层中执行任何命令并提交结果。 还有一个用于运行命令的 shell 形式。RUN |
WORKDIR <directory> | 为 Dockerfile 中后面的任何 、 、 、 和指令设置工作目录。RUN CMD ENTRYPOINT COPY ADD |
COPY <src> <dest> | 从中复制新文件或目录,并将其添加到路径 .<src> <dest> |
CMD <command> | 允许您定义在基于此镜像启动容器后运行的默认程序。每个 Dockerfile 只有一个 ,当存在多个实例时,只考虑最后一个实例。CMD CMD |
Dockerfile 是镜像构建的关键输入,可以促进自动化、 基于您的独特配置构建多层镜像。Dockerfile 可以 从简单开始,然后根据您的需求进行扩展,以支持更复杂的场景。
文件名
用于 Dockerfile 的默认文件名是 ,没有文件
外延。使用默认名称允许您运行命令
而无需指定其他命令标志。Dockerfile
docker build
某些项目可能需要不同的 Dockerfile 来实现特定目的。常见的
惯例是命名这些 .您可以指定
Dockerfile filename 使用命令的标志。
请参阅 docker build
CLI 参考 以了解该标志。<something>.Dockerfile
--file
docker build
--file
注意
我们建议将 default () 用于项目的 primary Dockerfile 文件。
Dockerfile
Docker 镜像
Docker 镜像由层组成。每个层都是构建的结果 指令。层按顺序堆叠,每个层都是 表示应用于上一层的更改的增量。
例
以下是使用 Docker 构建应用程序的典型工作流程。
以下示例代码显示了一个用 Python,使用 Flask 框架。
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
为了在没有 Docker Build 的情况下发布和部署此应用程序,您需要 需要确保:
- 所需的运行时依赖项安装在服务器上
- Python 代码被上传到服务器的文件系统
- 服务器使用必要的参数启动您的应用程序
以下 Dockerfile 创建一个容器镜像,其中包含所有 依赖项,这会自动启动您的应用程序。
# syntax=docker/dockerfile:1
FROM ubuntu:22.04
# install app dependencies
RUN apt-get update && apt-get install -y python3 python3-pip
RUN pip install flask==3.0.*
# install app
COPY hello.py /
# final configuration
ENV FLASK_APP=hello
EXPOSE 8000
CMD ["flask", "run", "--host", "0.0.0.0", "--port", "8000"]
以下是此 Dockerfile 的用途:
Dockerfile 语法
要添加到 Dockerfile 的第一行是 # 语法
解析器指令。
虽然是可选的,但此指令指示 Docker 构建器使用什么语法
解析 Dockerfile 时,并允许启用了 BuildKit 的旧版 Docker 在解析
开始构建。解析器指令必须出现在
您的 Dockerfile,并且应该是 Dockerfile 中的第一行。
# syntax=docker/dockerfile:1
提示
我们建议使用 ,它始终指向最新的 版本 1 语法的发布。BuildKit 会自动检查 语法,确保您使用的是最新版本。
docker/dockerfile:1
基本镜像
语法指令后面的行定义要使用的基础镜像:
FROM ubuntu:22.04
FROM
指令设置您的基础
镜像复制到 Ubuntu 的 22.04 版本。执行以下所有指令
在此基础镜像中:Ubuntu 环境。符号 , 遵循
命名 Docker 镜像的标准。在构建镜像时,您
使用此表示法为您的镜像命名。您可以
利用,方法是使用
Dockerfile 指令。ubuntu:22.04
name:tag
FROM
Docker Hub 包含大量可用于此目的的官方镜像。
环境设置
以下行在基础镜像中执行生成命令。
# install app dependencies
RUN apt-get update && apt-get install -y python3 python3-pip
此 RUN
指令执行
shell 更新 APT 包索引并在
容器。
评论
请注意这行。这是一条评论。评论
Dockerfile 以 符号开头。随着 Dockerfile 的发展,注释可以
有助于为未来的读者记录 Dockerfile 的工作原理
以及文件的编辑者,包括未来的自己!# install app dependencies
#
注意
您可能已经注意到,注释使用与文件第一行的语法指令相同的符号表示。 仅当模式与 指令,并显示在 Dockerfile 的开头。否则,它是 视为评论。
安装依赖项
第二个指令安装
Python 应用程序。RUN
flask
RUN pip install flask==3.0.*
此说明的先决条件是 安装到内部版本中
容器。第一个命令 安装 ,这确保我们可以
使用命令安装 Flask Web 框架。pip
RUN
pip
复制文件
下一个指令使用 COPY
指令将文件从本地构建上下文复制到镜像的根目录中。hello.py
COPY hello.py /
构建上下文是您可以访问的文件集
在 Dockerfile 指令中,例如 和 。COPY
ADD
在指令之后,文件被添加到文件系统中
生成容器。COPY
hello.py
设置环境变量
如果您的应用程序使用环境变量,则可以设置环境变量
在 Docker 构建中使用 ENV
指令。
ENV FLASK_APP=hello
这将设置我们稍后需要的 Linux 环境变量。Flask,框架 在此示例中,使用此变量启动应用程序。没有这个, Flask 不知道在哪里可以找到我们的应用程序来运行它。
暴露的端口
EXPOSE
指令标记了
我们的最终镜像有一个在 Port 上侦听的服务。8000
EXPOSE 8000
此说明不是必需的,但这是一种很好的做法,有助于工具和 团队成员了解此应用程序正在做什么。
启动应用程序
最后,CMD
指令将
命令,该命令在用户基于此镜像启动容器时运行。
CMD ["flask", "run", "--host", "0.0.0.0", "--port", "8000"]
此命令启动 Flask 开发服务器,侦听所有地址
在端口 上。此处的示例使用 的 “exec form” 版本的 .
也可以使用 “shell form”:8000
CMD
CMD flask run --host 0.0.0.0 --port 8000
这两个版本之间存在细微的差异,
例如,在它们如何捕获 和 等信号方面。
有关这些差异的更多信息,请参阅 Shell 和 exec 表单SIGTERM
SIGKILL
建筑
要使用上一节中的 Dockerfile 示例构建容器镜像,请使用以下命令:docker build
$ docker build -t test:latest .
该选项指定镜像的名称和标记。-t test:latest
命令末尾的单个点 () 将构建上下文设置为当前目录。这意味着
build 希望找到 Dockerfile 和目录中的文件
其中调用命令。如果这些文件不存在,则构建将失败。.
hello.py
构建镜像后,您可以将应用程序作为容器运行,并指定镜像名称:docker run
$ docker run -p 127.0.0.1:8000:8000 test:latest
这会将容器的端口 8000 发布到
Docker 主机。http://localhost:8000