Docker Build 是 Docker Engine 最常用的功能之一。当你创建一个镜像时,你正在使用 Docker Build。构建是软件开发生命周期的关键部分,允许您打包和捆绑代码并将其发布到任何地方。
打包 APP
DockerFile
一切都开始于一份 DockerFile 文件。Docker 通过读取 Dockerfile 中的指令来构建镜像。Dockerfile 是一个文本文件,包含构建源代码的说明。Dockerfile 指令语法由Dockerfile reference中的规范引用定义。
最常用指令:
| 指令 | 说明 |
|---|---|
FROM <image> | 定义一个基础镜像。 |
RUN <command> | 在当前镜像之上的新层中执行任何命令并提交结果。RUN 还有一个 shell 形式,用于运行命令。 |
WORKDIR <directory> | 设置 Dockerfile 中 RUN、CMD、ENTRYPOINT、COPY 和 ADD 指令的工作目录。 |
COPY <src> <dest> | 从<src>复制新的文件或目录,并将它们添加到路径<dest>的容器文件系统中。 |
CMD <command> | 允许您定义在基于此镜像启动容器后运行的默认程序。每个 Dockerfile 只有一个 CMD,当存在多个 CMD 实例时,只尊重最后一个 CMD 实例。 |
文件名
默认使用不带拓展名的DockerFile,如果需要指定则使用--file(-f)参数。
镜像
DockerImage 包含多层,每一层都是一次构建指令的结果。层与层堆叠排列。每个层都是一个 delta,表示应用于前一层的更改。
操作示例
- hello.py
from flask import Flask |
- DockerFile
# base image |
- 构建
-t specify name and tag of the image |
- 运行
docker run -p 127.0.0.1:8000:8000 test:latest |
构建上下文
构建上下文是构建可以访问的文件集。传递给生成命令的位置参数指定要用于生成的上下文。
docker build [OPTIONS] PATH | URL | - |
Local context
默认使用DockerFile文件 |
Remote context
默认分支根目录 |
多阶段构建
多阶段构建对于那些努力优化 Dockerfiles,同时保持它们易于阅读和维护的人来说是有用的。
完整构建
# syntax=docker/dockerfile:1 |
完整构建 |
指定结束位置
构建到指定位置 |
从其他镜像拷贝
COPY --from=nginx:latest /etc/nginx/nginx.conf /nginx.conf |
使用之前阶段作基础
# syntax=docker/dockerfile:1 |
构建变量
在 Docker Build 中,构建参数(ARG)和环境变量(ENV)都是将信息传递到构建过程中的一种手段。您可以使用它们来参数化构建,从而实现更灵活和可配置的构建。
多平台镜像
Docker 镜像可以支持多个平台,这意味着单个镜像可以包含不同架构的变体,有时还可以包含不同的操作系统,比如 Windows。
当你运行一个支持多平台的镜像时,Docker 会自动选择与你的操作系统和架构相匹配的镜像。参考
构建多平台镜像
在调用构建时,可以设置--platform标志来指定构建输出的目标平台。例如“linux/amd64”、“linux/arm64”、“darwin/amd64”。
策略
- 在内核中使用
QEMU仿真支持 - 在由不同体系结构的多个节点支持的单个构建器上构建。
- 使用 Dockerfile 中的一个阶段来交叉编译到不同的架构
Build secrets
构建秘密是任何敏感信息,如密码或 API 令牌,作为应用程序构建过程的一部分使用。
构建参数和环境变量不适合将秘密传递给构建,因为它们会保留在最终映像中。相反,应该使用秘密挂载或 SSH 挂载,它们将秘密安全地公开给构建。
参考
注释
docker build --push --annotation "foo=bar" . |
OpenTelemetry 支持
docker run -d --name jaeger -p "6831:6831/udp" -p "16686:16686" --restart unless-stopped jaegertracing/all-in-one |
指令集
| 指令 | 说明 |
|---|---|
| ADD | Add local or remote files and directories. |
| ARG | Use build-time variables. |
| CMD | Specify default commands. |
| COPY | Copy files and directories. |
| ENTRYPOINT | Specify default executable. |
| ENV | Set environment variables. |
| EXPOSE | Describe which ports your application is listening on. |
| FROM | Create a new build stage from a base image. |
| HEALTHCHECK | Check a container’s health on startup. |
| LABEL | Add metadata to an image. |
| MAINTAINER | Specify the author of an image. |
| ONBUILD | Specify instructions for when the image is used in a build. |
| RUN | Execute build commands. |
| SHELL | Set the default shell of an image. |
| STOPSIGNAL | Specify the system call signal for exiting a container. |
| USER | Set user and group ID. |
| VOLUME | Create volume mounts. |
| WORKDIR | Change working directory. |
参考文档
Docker Build
Dockerfile reference
- 本文作者: Tiny Beer
- 本文链接: https://tinybeer.github.io/2024/06/13/docker-build/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!
