Как развернуть код из Github с помощью ключа развертывания в Docker?

Я хочу вставить код из 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 не удастся позже из-за привилегий, который не работает, как и ожидалось, поскольку аутентификации не произошло.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
0
2 196
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

На самом деле вам не нужно копировать свой закрытый ключ в свой контейнер (и вам лучше не делать этого).

Все, что вам нужно, это установить и запустить 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

Я написал короткий пост на основе моего ответа выше.

Хорошо, я понял, поэтому, чтобы не вставлять ключи, и я действительно собираюсь использовать docker compose позже, поскольку у меня есть несколько служб, я только начинал. Итак, подойдя к делу, я попробовал сборку докеров. -v $ SSH_AUTH_SOCK: / tmp / ssh-agent -e SSH_AUTH_SOCK = / tmp / ssh-agent. Это привело к: unknown сокращенный флаг: 'v' in -v См. 'Docker build --help'. Можете ли вы указать мне на соответствующую документацию о том, как делать то, что вы предлагаете? Большое спасибо за помощь :) и можно ли протестировать файл докера с помощью сборки докера, а затем позже написать составить докер?

Harsh M 12.04.2018 21:22

@HarshM флаги -v и -e используются с командой docker run, а не с docker build, потому что смонтированные тома и переменные среды связаны со средой выполнения контейнера, а не с самим образом.

zinovyev 12.04.2018 21:55

Да, это возможно, и на самом деле это тоже так работает. Docker compose часто использует находящийся ниже Dockerfile для создания и запуска вашей службы. Это просто помогает вам определить эти флаги в хорошо отформатированном файле конфигурации, а также определить некоторые связанные службы.

zinovyev 12.04.2018 21:59

Я понял, но я учел ваше предложение и теперь использую CodeBuild в качестве инструмента сборки. и не использовать ssh для получения кода в образе докера. Спасибо.

Harsh M 24.04.2018 15:04

Я не понимаю. Для "docker run" вам нужен образ, но на этапе сборки используется ssh. Как я могу смонтировать файл сокета ssh-aget, пока я создаю образ строить?

Oroffe 22.01.2021 11:13

Редактировать ~/.ssh/config

Добавить с новым ключом

Host github.com
IdentityFile /root/.ssh/id_rsa

Это будет означать использование ключа, не защищенного паролем.

Bas Peeters 13.04.2018 13:46

Из этого ссылка на сайт:

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

Другие вопросы по теме