Недопустимый формат id_rsa в Dockerfile при использовании Makefile - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь передать ключ S SH в Dockerfile, чтобы я мог снять частные репозитории с Git.

Это работает, когда я использую это в командной строке

export SSH_PRIVATE_KEY="$(cat ~/.ssh/id_rsa)"
docker build --build-arg SSH_PRIVATE_KEY  --tag image:latest .

Ниже приведен фрагмент моего Dockerfile

ARG SSH_PRIVATE_KEY

RUN apt-get update && apt-get install -y git && apt-get install -y nano && \
    apt-get update && apt-get install -y python3.7 python3-pip python3.7-dev && \
    rm -rf /var/lib/apt/lists/*

RUN mkdir -p ~/.ssh && umask 0077 && echo "${SSH_PRIVATE_KEY}" > ~/.ssh/id_rsa \
    && git config --global url."git@github.com:".insteadOf https://github.com/ \
    && ssh-keyscan github.com >> ~/.ssh/known_hosts

Однако, когда я пытаюсь запустить его из make-файла, вот так

SSH_PRIVATE_KEY=$(shell cat ~/.ssh/id_rsa)


build-image:
    docker build --build-arg SSH_PRIVATE_KEY="${SSH_PRIVATE_KEY}" --tag image:latest -f ./docker/Dockerfile .

Я получаю ошибку

Загрузить ключ "/root/.ssh/id_rsa": неверный формат

Я что-то здесь не так делаю?

Спасибо!

1 Ответ

0 голосов
/ 23 апреля 2020

Избегайте выполнения команд git или ssh в Dockerfile. Поскольку у вас уже есть Makefile, клонировать репозиторий в среде сборки хоста очень просто:

# (not .PHONY, this actually creates the file)
some_dependency/some_file:
        git clone git@github.com:some_organization/some_dependency

build-image: some_dependency/some_file
        docker build --tag image:latest -f ./docker/Dockerfile .

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

docker run --rm image:latest cat .ssh/id_rsa

, и теперь ваш закрытый ключ скомпрометирован.

Аргумент против git clone в Dockerfile немного больше тонкий. Кэширование слоя Docker означает, что он попытается избежать повторного запуска уже запущенной команды. Это означает, что если вы уже создали этот образ на этом хосте, повторный запуск docker build будет использовать ту же проверку, что и раньше; он не будет повторять git clone, и вы застрянете на старой версии. Это также означает, что построение одного и того же образа на разных хостах может давать разные результаты, в зависимости от того, когда он был создан в первый раз.

В контексте частного репозитория, над которым работают ваши коллеги, также рассмотрите случаи где вам нужно создать тестовый образ на основе запроса извлечения или другой ветви, или где вам действительно нужно протестировать локальное изменение на основе этой зависимости. git clone в Dockerfile, работающем специально для master, встанет у вас на пути; клонирование репозитория на хосте позволяет оба этих случая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...