docker buildkit монтирует ssh при использовании перенаправления удаленного агента

Я использую --sshdocker 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 линия.

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