Docker build

构建镜像
# -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-argdocker build 时传入。


🛠️ 二、具体作用示例:HTTP_PROXY

场景:

你的服务器在企业内网,无法直接访问互联网(如 npm installapt-get update 会失败),必须通过代理。

解决方案:

  1. docker build 时传入代理地址

    docker build --build-arg HTTP_PROXY=http://proxy.example.com -t myimage .
    
  2. 在 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"]

💡 注意:aptcurl 等工具会自动读取 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 流水线中的标准实践

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容