我正在为使用Dockerfile
访问密钥秘密进行参数化的Docker映像编写一个aws
(我知道最佳实践是在运行时将任何和所有秘密作为环境变量进行传递,但是我只是在尝试,而不是构建我希望在生产中运行的东西。
但是,当我运行docker build
时,构建过程意外失败。
我正在运行的命令是:
docker build -t foobar . --build-arg aws_access_key_id=SOMETHING --build-arg aws_secret_access_key=SOMETHING_ELSE
Dockerfile
的主要部分是:
FROM python:3.6
# set the working directory
RUN ["mkdir", "app"]
WORKDIR "app"
# install environment dependencies
COPY "requirements.txt" .
# install code dependencies
RUN ["pip", "install", "-r", "requirements.txt"]
# provision
ARG aws_access_key_id
ARG aws_secret_access_key
RUN ["sh", "-c", "\"aws configure set aws_access_key_id $aws_access_key_id\""]
RUN ["sh", "-c", "\"aws configure set aws_secret_access_key $aws_secret_access_key\""]
我收到的错误消息是:
sh: 1: aws configure set aws_access_key_id ******************MQ: not found
The command 'sh -c "aws configure set aws_access_key_id $aws_access_key_id"' returned a non-zero code: 127
基本上sh
表示它在构建时不知道任何aws
命令。但是,我清楚地表明awscli
是requirements.txt
中的一个依赖项,它是较早安装的(为了完整性起见,在此提供;这是一个单行文件):
awscli
这些sh
命令在我的本地计算机上运行。当我将最后两个sh
命令从图像中注释掉,构建图像,通过docker exec -it <pid> /bin/bash
插入外壳并在那里执行它们时,它们也起作用。
因此,我的问题是:为什么这些命令在构建时失败?
答案 0 :(得分:1)
将运行命令更改为以下内容:
RUN aws configure set aws_access_key_id $aws_access_key_id
RUN aws configure set aws_secret_access_key $aws_secret_access_key
原因:
以这种方式将“ aws configure set aws_access_key_id $aws_access_key_id
”作为实际命令,而不是“ aws
”作为命令。
基本上,您要添加双引号并得出以下结果:
$ sh -c "\"echo foo\""
sh: echo foo: command not found
您可以在示例中删除转义的引号,它将起作用。