Как безопасно git clone / pip установить частный репозиторий в мой образ докера?

У меня есть частное репо, содержащее пакеты, которые я хочу установить. Я потратил довольно много времени на чтение различных форумов и статей о различных способах безопасного выполнения этой задачи. Похоже, нет единого мнения о том, как лучше всего это сделать (если это вообще возможно). Я, очевидно, не хочу раскрывать какие-либо ключи / секреты ssh в моем файле докеров - я хочу быть осторожным, делая их доступными через историю докеров.


person Jesus Garcia    schedule 30.04.2019    source источник


Ответы (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" vs RUN --mount=type=ssh,id=github_ssh_key pip install private-repo && more commands ...

person VonC    schedule 01.05.2019
comment
У меня проблема при запуске части RUN --mount-type=ssh .... Я получаю /bin/sh: 1: --mount=type=ssh,: not found Я немного погуглил, но не смог найти ничего полезного. - person Jesus Garcia; 01.05.2019
comment
@JesusGarcia Это выглядит так: medium .com / @ tonistiigi /. Вы не используете серверную часть BuildKit. Проверьте свою версию Docker и раздел Использование секретов статьи, где вам нужно установить DOCKER_BUILDKIT=1. - person VonC; 01.05.2019
comment
Я установил DOCKER_BUILDKIT = 1, и я также использую правильную версию докера. Мне удалось избавиться от ошибки, запустив ее как /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
comment
Я заставил его работать. Мне пришлось использовать 2 отдельные 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
comment
Работает ли это, если это частное репо имеет также некоторую другую частную зависимость от какого-то частного / внутреннего репозитория. - person Luk Aron; 30.01.2021
comment
@LukAron должен, если закрытый ключ аутентифицирует вас как человека, имеющего доступ к этим частным репозиториям. - person VonC; 30.01.2021
comment
Я получаю такую ​​ошибку: 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
comment
@dallonsi Не могли бы вы попробовать с закрытым ключом, не защищенным парольной фразой? - person VonC; 15.02.2021
comment
@dallonsi Для защиты парольной фразы закрытым ключом вам понадобится buildkit: stackoverflow.com/a/64036342/6309 - person VonC; 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 .
person Dave Reikher    schedule 23.12.2019
comment
работает для меня. Благодарим за уведомление о том, что ssh-agent на хосте должен работать, даже если мы передаем ключ ssh в контейнер докера для сборки. - person Luk Aron; 30.01.2021

Несмотря на использование современного (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, затем следуйте ответу Дэйва Рейхера .

person Josh Friedlander    schedule 08.06.2020
comment
Интересное обновление, точнее моего ответа. Проголосовали. - person VonC; 08.06.2020

Я использую 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
person Gino Mempin    schedule 19.11.2020
comment
Работает ли это, если это частное репо имеет также некоторую другую частную зависимость от какого-то частного / внутреннего репозитория. - person Luk Aron; 30.01.2021
comment
команда apk не найдена - person Luk Aron; 30.01.2021
comment
@LukAron apk - менеджер пакетов для Alpine. Если вы получаете сообщение «Команда не найдена», значит, ваш образ Docker, вероятно, не находится в Alpine. Используйте то, что есть в вашем контейнере. - person Gino Mempin; 30.01.2021
comment
@LukAron Что касается вашего 1-го вопроса, непонятно, что вы имеете в виду, и я думаю, вам придется опубликовать свой собственный отдельный вопрос, чтобы описать вашу собственную отдельную проблему. - 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

person fei yang    schedule 17.06.2021