You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何安全存储Dockerfile构建所需的凭证?

问题描述

我有如下Dockerfile:

FROM eclipse-temurin:17-alpine
RUN apk update && apk add --no-cache curl gcompat


ENV REPO_USERNAME=username
ENV REPO_PASSWORD=password

# Create a directory for Puppeteer
RUN mkdir -p /puppeteer

RUN curl --user "$REPO_USERNAME:$REPO_PASSWORD" -o reqLoader-linux http://10.81.9.1/tools/puppeteer-v13/reqLoader-linux
RUN mv reqLoader-linux /puppeteer/reqLoader-linux

当前构建正常,但凭证以明文环境变量形式存在,我希望将其存储在安全位置并在构建时调用。我在Win11的Git Bash中通过.sh脚本运行该Dockerfile,生产环境为Linux,寻求极简解决方案。

我尝试执行docker secret create my_secret ./credentials,credentials.json内容如下:

{
    "username" : "username",
    "password" : "password"
}

但出现错误:

Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.

我是否应该初始化swarm?同时我了解到Compose文件的secrets方案,期望实现仅Docker构建时可访问的加密凭证存储。

极简解决方案

1. 放弃Docker Swarm Secrets方案

Docker Swarm Secrets是为容器运行阶段设计的,构建阶段根本无法访问,而且需要初始化Swarm集群,完全不符合极简需求,直接跳过。

2. 采用构建参数+本地安全文件(最推荐)

这是无需额外工具的极简方案,步骤如下:

第一步:修改Dockerfile,替换明文ENV为构建参数

FROM eclipse-temurin:17-alpine
RUN apk update && apk add --no-cache curl gcompat

# 定义构建参数,无需设置默认值(避免明文泄露)
ARG REPO_USERNAME
ARG REPO_PASSWORD

# 创建Puppeteer目录
RUN mkdir -p /puppeteer

# 使用构建参数执行curl拉取文件
RUN curl --user "$REPO_USERNAME:$REPO_PASSWORD" -o reqLoader-linux http://10.81.9.1/tools/puppeteer-v13/reqLoader-linux
RUN mv reqLoader-linux /puppeteer/reqLoader-linux

第二步:本地存储凭证并通过脚本传递

  • 创建本地凭证文件credentials.txt(格式如下),并设置权限(Linux下执行chmod 600 credentials.txt,Windows下右键设置仅自己可读):
REPO_USERNAME=你的真实用户名
REPO_PASSWORD=你的真实密码
  • 在Git Bash的构建脚本中,加载凭证并传递给Docker构建:
# 从本地凭证文件加载环境变量
source ./credentials.txt

# 执行Docker构建,通过--build-arg传递参数
docker build --build-arg REPO_USERNAME=$REPO_USERNAME --build-arg REPO_PASSWORD=$REPO_PASSWORD -t 你的镜像名称 .
  • 关键:把credentials.txt加入.gitignore,绝对不要提交到代码仓库。

3. 方案优势

  • 构建参数仅在构建过程中存在,不会被打包到最终镜像(Docker默认不保留构建参数,除非主动转成ENV,这里我们没这么做)。
  • 本地凭证文件权限可控,只有你能读取,避免明文暴露在Dockerfile或脚本中。
  • 无需依赖Swarm、Compose等额外组件,完全符合极简要求。

关于Compose Secrets的说明

Compose Secrets同样是给运行阶段容器用的,构建阶段无法直接访问。如果用Compose构建,最终还是要通过build.args字段传递凭证,和上面的方案本质一致,没必要多此一举。

内容的提问来源于stack exchange,提问作者Black Bear

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 08:56:03