Докер может запускать команды оболочки, ориентированные на интерфейс командной строки AWS - PullRequest
0 голосов
/ 17 декабря 2018

Я пишу 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 говорит, что это не 't знает о любой команде aws во время сборки.Тем не менее, я четко указываю, что awscli является зависимостью в requirements.txt, которая устанавливается ранее (предоставлена ​​здесь для полноты; это однострочный файл):

awscli

Эти *На моей локальной машине работают команды 1025 *.Они также работают, когда я закомментирую эти две последние sh команды из образа, создаю образ, включаю его через docker exec -it <pid> /bin/bash и выполняю их там.

Поэтому мой вопрос: почему эти командытерпят неудачу во время сборки?

1 Ответ

0 голосов
/ 17 декабря 2018

Измените свою команду запуска на следующее:

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

Вы можете удалить экранированные кавычки в вашем примере, и это будет работать.

...