如何安全存储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
相关产品推荐
相关产品推荐

