假设启用了 BuildKit 的最新 Docker,文档建议使用
在 Dockerfile 中,访问密钥的方式如下:
--secret
选项的file
和env
类型。我想像这样使用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映像。