docker buildkit монтирует ssh при использовании перенаправления удаленного агента
Я использую --ssh
docker buildkit, и он отлично работает локально. Я хочу создать Docker на удаленном сервере и для этого использую-A
флаг для пересылки моего локального ключа github, например:
ssh -i "server.pem" -A <user>@<server-ip>
Затем в серверном терминале я запускаю:
ssh -T git@github.com
И я получаю сообщение "Привет, пользователь", что означает, что переадресация ключей работает нормально.
(На сервере$SSH_AUTH_SOCK
действительно установлено, и я могу git clone
)
Теперь при локальной сборке я использую:
DOCKER_BUILDKIT=1 docker build --ssh default=~/.ssh/id_rsa -t myimage:latest .
Что отлично работает.
Но на сервере закрытый ключ не существует в ~/.ssh/id_rsa. Итак, как я могу отправить его в сборку докеров? Пробовал это на сервере:
DOCKER_BUILDKIT=1 docker build --ssh default=$SSH_AUTH_SOCK -t myimage:latest .
Но это не работает. Ошибка:
could not parse ssh: [default]: invalid empty ssh agent socket, make sure SSH_AUTH_SOCK is set
Даже если SSH_AUTH_SOCK
установлен
Версия докера: 19.03
4 ответа
У меня была аналогичная проблема, и она была исправлена довольно просто, я завернул
${SSH_AUTH_SOCK}
в фигурных скобках
eval $(ssh-agent)
ssh-add ~/.ssh/id_rsa
DOCKER_BUILDKIT=1 docker build -t myimage:latest --ssh default=${SSH_AUTH_SOCK} .
В файле Docker у меня есть соответствующая инструкция RUN для запуска команды, требующей конфиденциальных данных.
RUN --mount=type=ssh \
mkdir vendor && composer install
Тебе нужно иметь ssh-agent
работает на вашем компьютере, и ключ, добавленный к нему с ssh-add
или используйте ssh -A -o AddKeysToAgent=true
при входе в систему. SSH не будет автоматически пересылать ключ, указанный в -i
если вы установите -A
насколько мне известно. После входа в систему вы можете запуститьssh-add -L
чтобы убедиться, что ваши ключи были отправлены, и если вы видите там записи, то docker build --ssh default .
теперь должно работать нормально.
eval `ssh-agent`
ssh-add server.pem
ssh -A <user>@<server-ip>
Другая возможная причина: «Ошибка проверки ключа хоста»: в вашем Dockerfile вам необходимо либо использовать ssh-keyscan для настройки.~/.ssh/known_hosts
или отключите проверку ключа хоста в ssh.
Ваша проблема в том, что вы указываете явный путь к закрытому ключу. Поддержка монтирования ssh будет использовать ваш агент по умолчанию, но вы сказали этого не делать. Вместо этого попробуйте:
DOCKER_BUILDKIT=1 docker build --ssh default -t myimage:latest .
Я использую следующие Dockerfile
для тестирования:
# syntax=docker/dockerfile:experimental
FROM alpine
RUN apk add --update git openssh
RUN mkdir -m 700 /root/.ssh; \
printf "Host *\nStrictHostkeyChecking no" > /root/.ssh/config; \
chmod 600 /root/.ssh/config
RUN --mount=type=ssh ssh git@github.com
Вызывается, как показано, и должно отображать сообщение об успехе от ssh git@github.com
линия.