Я скопировал этот код из того, что похоже на различные рабочие файлы Docker, вот мое:
FROM ubuntu
MAINTAINER Luke Crooks "luke@pumalo.org"
# Update aptitude with new repo
RUN apt-get update
# Install software
RUN apt-get install -y git python-virtualenv
# Make ssh dir
RUN mkdir /root/.ssh/
# Copy over private key, and set permissions
ADD id_rsa /root/.ssh/id_rsa
RUN chmod 700 /root/.ssh/id_rsa
RUN chown -R root:root /root/.ssh
# Create known_hosts
RUN touch /root/.ssh/known_hosts
# Remove host checking
RUN echo "Host bitbucket.org\n\tStrictHostKeyChecking no\n" >> /root/.ssh/config
# Clone the conf files into the docker container
RUN git clone git@bitbucket.org:Pumalo/docker-conf.git /home/docker-conf
Это дает мне ошибку
Step 10 : RUN git clone git@bitbucket.org:Pumalo/docker-conf.git /home/docker-conf
---> Running in 0d244d812a54
Cloning into '/home/docker-conf'...
Warning: Permanently added 'bitbucket.org,131.103.20.167' (RSA) to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
2014/04/30 16:07:28 The command [/bin/sh -c git clone git@bitbucket.org:Pumalo/docker-conf.git /home/docker-conf] returned a non-zero code: 128
Я впервые использую dockerfiles, но из того, что я прочитал (и взял из рабочих конфигов), я не могу понять, почему это не работает.
Мой id_rsa находится в той же папке, что и мой dockerfile, и является копией моего локального ключа, который может без проблем клонировать этот репозиторий.
Редактировать:
В моем dockerfile я могу добавить:
RUN cat /root/.ssh/id_rsa
И он печатает правильный ключ, поэтому я знаю, что он копируется правильно.
Я также попытался сделать, как советовал Ной, и побежал:
RUN echo "Host bitbucket.org\n\tIdentityFile /root/.ssh/id_rsa\n\tStrictHostKeyChecking no" >> /etc/ssh/ssh_config
К сожалению, это тоже не работает.
ssh-keyscan
по умолчанию установлен таймаут в 5 секунд, который часто превышал битбакет.ssh-keyscan
даже не сообщит об ошибке. Так что лучше беги,RUN ssh-keyscan -T 60 bitbucket.org >> /root/.ssh/known_hosts
чтобы быть в безопасности.ssh-keyscan
это проблема? Насколько я понимаю, он просто вытянет открытый ключ Github / Bitbucket. Какую альтернативу можно использовать, чтобы она не оказалась в слое?known_hosts
файле. Люди просто высказывают случайные вещи, когда они звучат достаточно тревожно.Вам следует создать новый набор ключей SSH для этого образа Docker, так как вы, вероятно, не хотите вставлять туда свой собственный закрытый ключ. Чтобы он работал, вам нужно добавить этот ключ к ключам развертывания в вашем git-репозитории. Вот полный рецепт:
Сгенерируйте ключи ssh, с помощью
ssh-keygen -q -t rsa -N '' -f repo-key
которых вы получите файлы repo-key и repo-key.pub.Добавьте repo-key.pub к ключам развертывания вашего репозитория.
На GitHub перейдите в [ваш репозиторий] -> Настройки -> Развернуть ключи
Добавьте что-то подобное в ваш Dockerfile:
Обратите внимание, что выше отключает StrictHostKeyChecking, поэтому вам не нужно .ssh / known_hosts. Хотя мне, вероятно, больше нравится решение с ssh-keyscan в одном из ответов выше.
источник
fatal: Could not read from remote repository.
Там нет необходимости возиться с конфигурациями SSH. Используйте файл конфигурации (не файл Docker), который содержит переменные среды, и попросите сценарий оболочки обновить файл Docker во время выполнения. Вы храните токены в своих файлах Docker и можете клонировать через https (не нужно генерировать или передавать ключи ssh).
Перейдите в Настройки> Личные токены доступа.
repo
включенной областью действия.git clone https://MY_TOKEN@github.com/user-or-org/repo
Некоторые комментаторы отметили, что если вы используете общий Dockerfile, это может предоставить ваш ключ доступа другим людям в вашем проекте. Хотя это может или не может быть проблемой для вашего конкретного случая использования, вот несколько способов, которые вы можете решить:
sed
или похожую, то есть вызовите скрипт,sh rundocker.sh MYTOKEN=foo
который заменил бы наhttps://{{MY_TOKEN}}@github.com/user-or-org/repo
. Обратите внимание, что вы также можете использовать файл конфигурации (в формате .yml или в любом другом формате), чтобы сделать то же самое, но с переменными среды.источник
Settings > Applications
?Другой вариант - использовать многоэтапную сборку Docker, чтобы гарантировать, что ваши ключи SSH не включены в окончательный образ.
Как описано в моем посте, вы можете подготовить ваше промежуточное изображение с необходимыми зависимостями для git clone, а затем
COPY
необходимые файлы в ваше окончательное изображение.Кроме того, если мы используем
LABEL
промежуточные слои, мы можем даже удалить их из машины после завершения.Затем мы можем построить:
Докажите, что наши ключи SSH пропали:
Очистите промежуточные изображения со сборочной машины:
источник
RUN
чтобы вы не оставили ключ в предыдущем слое изображения. По состоянию на докер1.13
вы можете использовать--squash
экспериментальный аргумент, который также удалит ключ SSH в ваших окончательных слоях изображения.Для репозитория bitbucket сгенерируйте пароль приложения (настройки Bitbucket -> Управление доступом -> Пароль приложения, см. Изображение) с доступом для чтения к репозиторию и проекту.
Тогда команда, которую вы должны использовать:
источник
--recursive
не работает. Я должен был вставитьgit clone
для каждого подмодуля, что хорошо, но было бы здорово, если бы он работал рекурсивно.Вы часто не хотите выполнять
git clone
частное репо из сборки Docker. Выполнение клона предполагает размещение личных учетных данных ssh внутри изображения, где они могут быть впоследствии извлечены любым пользователем, имеющим доступ к вашему изображению.Вместо этого обычной практикой является клонирование git-репозитория из-за пределов докера в выбранном вами инструменте CI и просто
COPY
файлы в образ. Это имеет второе преимущество: кэширование докера. Кэширование Docker проверяет выполняемую команду, включенные в нее переменные среды, входные файлы и т. Д., И если они идентичны предыдущей сборке из того же родительского шага, он использует этот предыдущий кэш. Сgit clone
команды сама команда идентична, поэтому docker будет повторно использовать кэш, даже если внешнее git-репо изменилось. Тем не менее,COPY
команда будет смотреть на файлы в контексте сборки и может видеть, идентичны ли они или были обновлены, и использовать кеш только тогда, когда это уместно.Если вы собираетесь добавить учетные данные в свою сборку, рассмотрите возможность сделать это с многоэтапной сборкой, и размещайте эти учетные данные только на ранней стадии, которая никогда не будет помечена и выдвинута за пределы хоста сборки. Результат выглядит так:
Совсем недавно BuildKit тестировал некоторые экспериментальные функции, которые позволяют передавать ключ ssh как монтирование, которое никогда не записывается в образ:
И вы можете построить это с:
Обратите внимание, что для этого все еще требуется, чтобы ваш ключ ssh не был защищен паролем, но вы можете, по крайней мере, запустить сборку за один этап, удалив команду COPY и избегая того, чтобы учетные данные ssh когда-либо были частью образа.
BuildKit также добавил функцию только для ssh, которая позволяет вам сохранить ваши ssh-ключи, защищенные паролем, результат выглядит так:
И вы можете построить это с:
Опять же, это внедряется в сборку без записи в слой изображения, что устраняет риск случайной утечки учетных данных.
Чтобы заставить docker запускать
git clone
даже когда кэшированные строки были ранее кэшированы, вы можете ввести ARG сборки, которая меняется с каждой сборкой, чтобы сломать кеш. Это выглядит так:Затем вы вводите этот изменяемый аргумент в команду сборки docker:
источник
Вышеуказанные решения не работали для bitbucket. Я подумал, что это делает трюк:
источник