Передача агента SSH во время сборки докеров

При создании изображения докеров с помощью файла docker, я должен клонировать репозиторий github. Я добавил свои общедоступные ключи ssh к моей учетной записи hb wash > w20 > , и я могу клонировать репо с моего хоста докеров. Хотя я вижу, что я могу использовать ключ ssh хоста docker, сопоставляя переменную $SSH_AUTH_SOCK env во время запуска docker как docker run --rm -it --name container_name \ -v $(dirname $SSH_AUTH_SOCK):$(dirname $SSH_AUTH_SOCK) \ -e SSH_AUTH_SOCK=$SSH_AUTH_SOCK my_image.

Как я могу сделать то же самое во время сборки docker?

Ответ 1

Это может быть решено с использованием альтернативного сценария сборки. Например, вы можете создать скрипт bash и поместить его в ~/usr/local/bin/docker-compose или в ваше любимое место:

#!/bin/bash

trap 'kill $(jobs -p)' EXIT
socat TCP-LISTEN:56789,reuseaddr,fork UNIX-CLIENT:${SSH_AUTH_SOCK} &

/usr/bin/docker-compose [email protected]

Затем в вашем Dockerfile вы бы использовали существующий сокет ssh:

...
ENV SSH_AUTH_SOCK /tmp/auth.sock
...
  && apk add --no-cache socat openssh \
  && /bin/sh -c "socat -v UNIX-LISTEN:${SSH_AUTH_SOCK},unlink-early,mode=777,fork TCP:172.22.1.11:56789 &> /dev/null &" \
  && bundle install \
...
or any other ssh commands will works

Теперь вы можете вызвать нашу собственную docker-compose build. Это вызвало бы фактический сценарий docker с общим сокетом ssh.

Ответ 2

Для Docker 18.09 и новее

Вы можете использовать новые функции Docker для пересылки вашего существующего соединения с агентом SSH или ключа для сборщика. Это позволяет, например, клонировать ваши личные репозитории во время сборки.

шаги:

Сначала установите переменную среды для использования нового BuildKit

export DOCKER_BUILDKIT=1

Затем создайте Dockerfile с новым (экспериментальным) синтаксисом:

# syntax=docker/dockerfile:experimental

FROM alpine

# install ssh client and git
RUN apk add --no-cache openssh-client git

# download public key for github.com
RUN mkdir -p -m 0600 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts

# clone our private repository
RUN --mount=type=ssh git clone [email protected]:myorg/myproject.git myproject

И построить образ с

docker build --ssh default .

Узнайте больше об этом здесь: https://medium.com/@tonistiigi/build-secrets-and-ssh-forwarding-in-docker-18-09-ae8161d066

Ответ 3

К сожалению, вы не можете переслать свой ssh-сокет в контейнер сборки, так как монтирование томов времени сборки в настоящее время не поддерживается в Docker.

Это было предметом обсуждения в течение долгого времени, смотрите следующие вопросы на GitHub для справки:

Как видите, эта функция запрашивалась несколько раз для разных случаев использования. До сих пор сопровождающие не решались решить эту проблему, потому что считают, что монтирование тома во время сборки нарушит переносимость:

результат сборки должен быть независим от основного хоста

Как указано в этой дискуссии.

Ответ 4

Это тоже интересно:

Это выглядит как:

  • На хосте
mkfifo myfifo
nc -lk 12345 <myfifo | nc -U $SSH_AUTH_SOCK >myfifo
  • В докерфайле
RUN mkfifo myfifo
RUN while true; do \
  nc 172.17.0.1 12345 <myfifo | nc -Ul /tmp/ssh-agent.sock >myfifo \
done &

RUN export SSH_AUTH_SOCK=/tmp/ssh-agent.sock

RUN ssh ...