Я хочу вставить код из Github в образ Docker во время сборки. У меня есть ключ развертывания, сгенерированный из репозитория, но мне кажется, что ssh-agent не работает с моим образом Docker.
Что я сделал (мой Dockerfile):
FROM python:2.7-stretch
ADD ./id_rsa /root/.ssh/id_rsa
RUN eval "$(ssh-agent -s)"
RUN ssh-add -K /root/.ssh/id_rsa
Выход:
Step 12/22 : RUN eval "$(ssh-agent -s)"
---> Running in f9ad80981cee
Agent pid 6
Removing intermediate container f9ad80981cee
---> d773f7ce5917
Step 13/22 : RUN ssh-add -K /root/.ssh/id_rsa
---> Running in 95efeed6a7ad
Could not open a connection to your authentication agent.
The command '/bin/sh -c ssh-add -K /root/.ssh/id_rsa' returned a non-zero code: 2
Как видите, ssh-agent запущен, но ключи в него не добавляются.
Если я пропущу шаг ssh-add, мой git pull не удастся позже из-за привилегий, который не работает, как и ожидалось, поскольку аутентификации не произошло.





На самом деле вам не нужно копировать свой закрытый ключ в свой контейнер (и вам лучше не делать этого).
Все, что вам нужно, это установить и запустить ssh-agent как на вашем хосте, так и на вашем докер-контейнере, тогда все, что вам нужно сделать, это смонтировать файл сокета ssh-aget:
Если вы используете докер-сочинять:
environment:
- "SSH_AUTH_SOCK=/tmp/ssh-agent"
volumes:
- $SSH_AUTH_SOCK:/tmp/ssh-agent
С докер:
docker run -v $SSH_AUTH_SOCK:/tmp/ssh-agent 8be57bbc9561 sleep 1000000 # 8be57bbc9561 is an id of the image
docker exec -it -e SSH_AUTH_SOCK=/tmp/ssh-agent 5b6f4a8f8661 /bin/ash # 5b6f4a8f8661 is an id of the container
P.S
Что касается вашего случая, я думаю, что проблема может быть связана с командой export, которая обычно является evaled из кода с вывода ssh-agent.
Он должен предоставить вам две переменные: SSH_AUTH_SOCK и SSH_AGENT_PID. Но export не сохраняется в образах.
Вы использовали RUN два раза: сначала для запуска ssh-agent и экспорта переменных, а затем для добавления ключа. И каждая директива Dockerfile будет генерировать промежуточный контейнер (и экспорт не будет сохраняться через них).
Если вы все еще хотите использовать его таким образом (чего я настоятельно рекомендую избегать), вы можете попробовать связать обе команды в одном RUN:
RUN eval "$(ssh-agent -s)" && ssh-add /root/.ssh/id_rsa
Я написал короткий пост на основе моего ответа выше.
@HarshM флаги -v и -e используются с командой docker run, а не с docker build, потому что смонтированные тома и переменные среды связаны со средой выполнения контейнера, а не с самим образом.
Да, это возможно, и на самом деле это тоже так работает. Docker compose часто использует находящийся ниже Dockerfile для создания и запуска вашей службы. Это просто помогает вам определить эти флаги в хорошо отформатированном файле конфигурации, а также определить некоторые связанные службы.
Я понял, но я учел ваше предложение и теперь использую CodeBuild в качестве инструмента сборки. и не использовать ssh для получения кода в образе докера. Спасибо.
Я не понимаю. Для "docker run" вам нужен образ, но на этапе сборки используется ssh. Как я могу смонтировать файл сокета ssh-aget, пока я создаю образ строить?
Редактировать ~/.ssh/config
Добавить с новым ключом
Host github.com
IdentityFile /root/.ssh/id_rsa
Это будет означать использование ключа, не защищенного паролем.
Из этого ссылка на сайт:
The -K option is Apple's standard version of ssh-add, which stores the passphrase in your keychain for you when you add an ssh key to the ssh-agent.
If you don't have Apple's standard version installed, you may receive an error.
Попробуйте удалить параметр -K и построить его заново. Для меня сработало следующее:
FROM python:2.7-stretch
ADD ./id_rsa /root/.ssh/id_rsa
RUN eval "$(ssh-agent -s)" && ssh-add /root/.ssh/id_rsa
Хорошо, я понял, поэтому, чтобы не вставлять ключи, и я действительно собираюсь использовать docker compose позже, поскольку у меня есть несколько служб, я только начинал. Итак, подойдя к делу, я попробовал сборку докеров. -v $ SSH_AUTH_SOCK: / tmp / ssh-agent -e SSH_AUTH_SOCK = / tmp / ssh-agent. Это привело к: unknown сокращенный флаг: 'v' in -v См. 'Docker build --help'. Можете ли вы указать мне на соответствующую документацию о том, как делать то, что вы предлагаете? Большое спасибо за помощь :) и можно ли протестировать файл докера с помощью сборки докера, а затем позже написать составить докер?