将密钥添加到Docker构建中,使用环境变量而不是文件

4
假设启用了 BuildKit 的最新 Docker,文档建议使用--secret选项的fileenv类型。我想像这样使用env类型:
MYSECRET=thepassword
docker build --secret id=mysecret,env=MYSECRET -t myimage .

在 Dockerfile 中,访问密钥的方式如下:
RUN --mount=type=secret,id=mysecret \
    PASSWORD=$(cat /run/secrets/mysecret) && \
    <run command taking password arg> ${PASSWORD}

这种方法失败了,出现了cat: /run/secrets/mysecret: No such file or directory

一个类似的问题在这里被问到,但是在docker镜像中将密钥写入.condarc文件的额外步骤对我来说并不重要。根据那篇文章,将本地环境变量传递到单个RUN语句的docker构建范围内的基本操作应该“有效”,但对我来说却没有。

上面的构建命令运行良好,直到尝试访问应该映射到密钥的文件路径为止。尝试将MYSECRET作为--build-arg暂时传递到构建中显示环境变量可以被解析。

文档建议通过仅提供id来将--secret甚至默认为“env”模式:

MYSECRET=thepassword
docker build --secret id=MYSECRET -t myimage .

RUN --mount=type=secret,id=MYSECRET \
    PASSWORD=$(cat /run/secrets/MYSECRET) && \
    <run command taking password arg> ${PASSWORD}

当我尝试这样做时,实际上在开始构建之前就会抛出错误:

could not parse secrets: [id=MYSECRET]: failed to stat MYSECRET: stat MYSECRET: no such file or directory

这让我相信它仍然尝试使用文件模式,根本没有使用环境模式。

如果我选择将我的机密存储在文件中并使用文件模式加载它,那么它可以正常工作。但由于构建流水线的一些细节原因,我宁愿使用环境模式。

有人遇到过这个问题吗?

我正在使用运行Docker Desktop 4.17.0和Docker引擎20.10.23的Mac M1构建Linux docker映像。


你找到解决 /run/secrets/mysecret: No such file or directory 的方法了吗? - dvrm
1个回答

1

这个能用吗?

Dockerfile:

RUN --mount=type=secret,id=MYSECRET PASSWORD=$(cat /run/secrets/MYSECRET) && \ 
<run command taking password arg> ${PASSWORD}

终端(这里我跳过了可选的,env=):

docker build --secret id=MYSECRET -t myimage .

不,它似乎不起作用。 - justin.m.chase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接