У меня есть частное репо, содержащее пакеты, которые я хочу установить. Я потратил довольно много времени на чтение различных форумов и статей о различных способах безопасного выполнения этой задачи. Похоже, нет единого мнения о том, как лучше всего это сделать (если это вообще возможно). Я, очевидно, не хочу раскрывать какие-либо ключи / секреты ssh в моем файле докеров - я хочу быть осторожным, делая их доступными через историю докеров.
Как безопасно git clone / pip установить частный репозиторий в мой образ докера?
Ответы (5)
Как объясняется в разделе «Безопасная сборка небольшой образ докера python из частных репозиториев git ", который вам понадобится, с Docker 18.09+
--ssh
Вы можете использовать флаг--ssh
, чтобы перенаправить существующий ключ агента SSH компоновщику. Вместо передачи ключевых данных докер просто уведомит сборщика о том, что такая возможность доступна.
Теперь, когда сборщику требуется доступ к удаленному серверу через SSH, он обратится к клиенту и попросит его подписать конкретный запрос. необходим для этого соединения.
Сам ключ никогда не покидает клиента, и как только команда, запрашивающая доступ, завершится, на стороне построителя не будет информации, чтобы восстановить это удаленное соединение позже.Секреты:
Предоставляет параметр монтирования во время сборки на/var/run/secrets
, доступный только для команды, которая его использовала, и не включается в созданный слой.
То есть:
docker build --ssh github_ssh_key=/path/to/.ssh/git_ssh_id_rsa .
с этой командой используется только соединение агента, а не фактическое содержимое закрытого ключа.
никакие другие команды / шаги в Dockerfile не будут иметь к нему доступа.
Dockerfile на многоступенчатом первом шаге даст имя ключа github_ssh_key
, чтобы мы могли использовать его при вызове docker build
:
RUN --mount=type=ssh,id=github_ssh_key pip wheel \
--no-cache \
--requirement requirements.txt \
--wheel-dir=/app/wheels
ОП Хесус Гарсия сообщил (в комментариях), что он работает:
Мне пришлось использовать 2 отдельные
RUN
команды.Я не уверен, является ли это ограничением этой новой функции или тем, как я пытался объединить несколько команд в моем
RUN
, но я продолжал получать ошибку отказа в разрешении открытого ключа, когда я добавил ее какother commands && /bin/sh -c "mount=type=ssh,id=github_ssh_key pip install private-repo"
vsRUN --mount=type=ssh,id=github_ssh_key pip install private-repo && more commands ...
RUN --mount-type=ssh ...
. Я получаю /bin/sh: 1: --mount=type=ssh,: not found
Я немного погуглил, но не смог найти ничего полезного.
- person Jesus Garcia; 01.05.2019
DOCKER_BUILDKIT=1
.
- person VonC; 01.05.2019
/bin/sh -c "mount=type=ssh,id=github_ssh_key pip install private-repo"
, но теперь я получаю Permission denied (publickey). #12 35.87 fatal: Could not read from remote repository.
- person Jesus Garcia; 01.05.2019
RUN
команды. Я не уверен, является ли это ограничением этой новой функции или тем, как я пытался объединить несколько команд в моем RUN
, но я продолжал получать ошибку отказа в разрешении открытого ключа, когда я добавил ее как other commands && /bin/sh -c "mount=type=ssh,id=github_ssh_key pip install private-repo"
vs RUN --mount=type=ssh,id=github_ssh_key pip install private-repo && more commands ...
Спасибо, что указали мне на функция флага --ssh
- person Jesus Garcia; 07.05.2019
could not parse ssh: [github_ssh_key=~/.ssh/id_rsa]: failed to parse ~/.ssh/id_rsa: ssh: this private key is passphrase protected
- person dallonsi; 15.02.2021
Это сработало для меня с докером 19.03.5 (но должно работать с 18.09+):
Допустим, ваше частное репо находится на Github, github.com/user/repo.git
, и вы хотите pip install
использовать его как часть сборки докера. Ключ ssh для репо находится на хосте по адресу ~/.ssh/my_key
.
В Dockerfile:
RUN mkdir -p -m 0600 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts
RUN --mount=type=ssh pip install git+ssh://[email protected]/user/repo.git
Затем на хосте:
export DOCKER_BUILDKIT=1
eval `ssh-agent`
ssh-add ~/.ssh/my_key
docker build --ssh default=$SSH_AUTH_SOCK .
Несмотря на использование современного (19.03.8) Docker, ни одно из вышеперечисленных решений не помогло мне (даже после добавления DOCKER_BUILDKIT=1
) без дополнительной строки, которую я нашел в Сообщение в блоге Александры Ульш, которое, на мой взгляд, достаточно важно, чтобы заслужить дополнительный ответ, а не быть похороненным в комментариях.
Хотя флаг
--secret
присутствует в производственной версии Docker, есть несколько подсказок, поддержка которых пока носит экспериментальный характер.Например, первая строка файла Dockerfile, использующего секреты сборки, должна быть
# syntax = docker/dockerfile:1.0-experimental
. Без этой строки вы получите ошибкуfailed to create LLB definition: Dockerfile parse error line 6: Unknown flag: mount
. Эта строка позволяет Docker CLI использовать ссылку «экспериментальный интерфейс Dockerfile »для Moby BuildKit.
TL; DR добавьте комментарий # syntax = docker/dockerfile:1.0-experimental
в верхней части файла Docker, затем следуйте ответу Дэйва Рейхера .
Я использую Docker версии 19.03.13 (сборка 4484c46d9d) и использую функцию --ssh
, как описано в VonC и Ответы Дэйва Рейхера не помогли мне. Я все еще получаю сообщение об ошибке:
ОШИБКА: команда выполнена с ошибкой со статусом выхода 128: git clone -q 'ssh: // git @ hostname: port / group / repository.git' / tmp / pip-install-8eeeaipo / baseapi Проверьте журналы для полного вывода команды.
Обратите внимание, что я использую не репозиторий Github, а какой-то действительно частный / внутренний репозиторий. Примеры также из Документы Docker на --ssh
также показывают URL репозитория github.com. Я не уверен, что это так (это не должно быть), но я проследил это до _4 _ / _ 5_, не распознав имя хоста URL-адреса, тогда как при использовании github.com он работает так, как рекламируется.
Вместо этого я заставил его работать, используя простой --secret
(все еще часть BuildKit), передав ключ SSH (~/.ssh/id_rsa
) и файл ~/.ssh/known_hosts
в качестве секретов.
Dockerfile
# syntax=docker/dockerfile:1.0-experimental
FROM python:3.8-alpine3.11
RUN apk add openssh-client git
RUN mkdir -p -m 0600 /root/.ssh
RUN --mount=type=secret,id=known_hosts,dst=/root/.ssh/known_hosts \
--mount=type=secret,id=ssh_key,dst=/root/.ssh/id_rsa \
ssh-keyscan -H -t rsa hostname.of.private.repo \
&& pip install --no-cache-dir git+ssh://git@hostname:port/group/repository.git@12345678#egg=baseapi
Команда сборки
DOCKER_BUILDKIT=1 docker build \
--secret id=known_hosts,src=~/.ssh/known_hosts \
--secret id=ssh_key,src=~/.ssh/id_rsa \
-t name:tag \
-f Dockerfile \
.
Я проверил папку ~/.ssh
на созданном образе и, похоже, все еще правильно, что в нем не сохраняются ключи SSH. Смонтированные файлы остаются, но они пусты:
/app # ls -l ~/.ssh/
total 0
-rwxr-xr-x 1 root root 0 Nov 19 11:29 id_rsa
-rwxr-xr-x 1 root root 0 Nov 19 11:29 known_hosts
/app # cat ~/.ssh/id_rsa
/app # cat ~/.ssh/known_hosts
И попытка pip install
того же частного пакета потерпит неудачу.
Для справки:
* Docker: 19.03.13 (build 4484c46d9d)
* Image
- pip 20.2.4 from /usr/local/lib/python3.8/site-packages/pip (python 3.8)
- git 2.22.4
- OpenSSH_8.1p1, OpenSSL 1.1.1g 21 Apr 2020
apk
- менеджер пакетов для Alpine. Если вы получаете сообщение «Команда не найдена», значит, ваш образ Docker, вероятно, не находится в Alpine. Используйте то, что есть в вашем контейнере.
- person Gino Mempin; 30.01.2021
Используйте 1_
ci.yml
build_docker:
stage: build
image: docker:latest
variables:
DOCKER_HOST: tcp://docker:2375
# This instructs Docker not to start over TLS.
DOCKER_TLS_CERTDIR: ""
before_script:
- apk add --no-cache curl jq python3 py3-pip git bind-tools openssh-client
- echo $DOCKERPASS | docker login --username $DOCKERUSER --password-stdin
- mkdir -p -m 0700 ~/.ssh
- ssh-keyscan private-url >> ~/.ssh/known_hosts
- chmod 600 $SSH_KEY
services:
- docker:dind
script:
- export DOCKER_BUILDKIT=1
- eval $(ssh-agent)
- ssh-add $SSH_KEY
- docker build -t tag_name --ssh default=$SSH_AUTH_SOCK .
файл докеров
FROM puckel/docker-airflow:1.10.1
ARG SSH_PRIVATE_KEY
USER root
RUN apt-get update && apt-get install -y git openssh-client
RUN ssh-keyscan private-url >> ~/.ssh/known_hosts
COPY requirements.txt .
RUN --mount=type=ssh pip install git+ssh://private-url/project/repo.git
RUN pip install -r requirements.txt
см. изображение https://feiyang233.club/img/vm/23.png