构建镜像
# -t, --tag: 为构建的镜像指定名称和标签
# -f, --file: 指定 Dockerfile 的路径(默认是 PATH 下的 Dockerfile)
docker build -t myimage:latest .
docker build -f Dockerfile -t myimage:latest .
# 这会从当前目录读取 Dockerfile 并构建一个名为 myimage:latest 的镜像
docker build -f /path/to/Dockerfile -t myimage:latest .
# 这会从 /path/to/ 目录读取 Dockerfile 并构建一个名为 myimage:latest 的镜像
Docker 镜像的完整命名格式
[registry/][repository][:tag]
docker build -t deploy.deepexi.com/fastdata-east/deepexi-data-catalogue-web:v2.5.8_202511291110 .
设置构建参数
docker build --build-arg HTTP_PROXY=http://proxy.example.com -t myimage:latest .
中使用 --build-arg 的作用是:在 Docker 镜像构建过程中,向 Dockerfile 传递临时的、可变的参数值。
🔍 一、为什么需要 --build-arg?
Dockerfile 本身是静态的,但构建环境可能不同,比如:
- 公司内网需要通过代理访问外网(如下载依赖)
- 不同环境使用不同的版本号、密钥、仓库地址
- CI/CD 中动态传入 Git Commit ID、构建时间等
👉 这些动态值不能写死在 Dockerfile 里,就需要用 --build-arg 在 docker build 时传入。
🛠️ 二、具体作用示例:HTTP_PROXY
场景:
你的服务器在企业内网,无法直接访问互联网(如 npm install、apt-get update 会失败),必须通过代理。
解决方案:
-
在
docker build时传入代理地址docker build --build-arg HTTP_PROXY=http://proxy.example.com -t myimage . -
在 Dockerfile 中接收并使用这个参数
# Dockerfile ARG HTTP_PROXY # 声明接收 build-arg ARG HTTPS_PROXY # 通常 HTTPS 也需要 RUN apt-get update && apt-get install -y curl # ↑ 此时 apt-get 会自动使用 HTTP_PROXY 访问外网
✅ 构建完成后,
HTTP_PROXY不会保留在最终镜像中(除非你显式写入环境变量),所以不会泄露代理信息。
📌 三、关键特性
| 特性 | 说明 |
|---|---|
| 仅在构建阶段有效 | 运行容器时无法访问 ARG 定义的值 |
| 默认不保留 | 不会出现在镜像元数据或运行时环境中(安全!) |
| 可设默认值 | ARG HTTP_PROXY=default_value |
| 与 ENV 区别 |
ENV 会保留在镜像中,ARG 不会 |
🧩 四、完整 Dockerfile 示例
# syntax=docker/dockerfile:1
# 声明构建参数(可选默认值)
ARG HTTP_PROXY
ARG HTTPS_PROXY
# 如果你想让代理在 RUN 命令中生效,也可以显式设置为环境变量
# (某些工具如 npm、pip 需要明确设置)
ENV HTTP_PROXY=${HTTP_PROXY}
ENV HTTPS_PROXY=${HTTPS_PROXY}
RUN apt-get update && \
apt-get install -y python3-pip && \
pip3 install flask
# 清理代理环境(可选,避免残留)
ENV HTTP_PROXY=
ENV HTTPS_PROXY=
COPY . /app
WORKDIR /app
CMD ["python3", "app.py"]
💡 注意:
apt、curl等工具会自动读取HTTP_PROXY环境变量,所以通常只需ARG+ENV转换即可。
🔒 五、安全性提醒
❌ 不要用
--build-arg传递密码、密钥!
虽然ARG默认不保留在镜像中,但如果在RUN命令中使用了敏感信息(如curl -u user:password),可能被记录在镜像层历史中。-
✅ 敏感信息应使用:
- Docker BuildKit 的 secret mount(推荐)
- 多阶段构建 + 临时文件
- CI/CD 的安全变量 + 运行时挂载
🆚 对比:ARG vs ENV
ARG |
ENV |
|
|---|---|---|
| 作用阶段 | 仅构建时 | 构建时 + 运行时 |
| 是否保留在镜像 | 否(除非转为 ENV) | 是 |
| 用途 | 传构建参数(代理、版本等) | 设置运行时环境变量 |
| 安全性 | 较高 | 较低(会暴露在 docker inspect 中) |
✅ 总结
--build-arg的核心作用是:让 Docker 构建过程具备“环境感知能力”。
在你的命令中:
docker build --build-arg HTTP_PROX=http://proxy.example.com -t myimage .
✅ 实际效果是:让 Dockerfile 在执行 RUN 命令时能通过公司代理上网,成功下载依赖,完成构建。
这是企业内网、CI/CD 流水线中的标准实践。