Клонировать частное git-РЕПО с dockerfile

Я скопировал этот код из того, что кажется различными рабочими dockerfiles вокруг, вот мой:

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.orgntStrictHostKeyChecking non" >> /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.orgntIdentityFile /root/.ssh/id_rsantStrictHostKeyChecking no" >> /etc/ssh/ssh_config

это, к сожалению, также не работает.

5 ответов


мой ключ был защищен паролем, что вызвало проблему, рабочий файл теперь указан ниже (для помощи будущих гуглеров)

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
# Make ssh dir
RUN mkdir /root/.ssh/

# Copy over private key, and set permissions
ADD id_rsa /root/.ssh/id_rsa

# Create known_hosts
RUN touch /root/.ssh/known_hosts
# Add bitbuckets key
RUN ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts

# Clone the conf files into the docker container
RUN git clone git@bitbucket.org:User/repo.git

вы должны создать новый набор ключей SSH для этого образа Docker, так как вы, вероятно, не хотите вставлять туда свой собственный закрытый ключ. Чтобы он работал, вам нужно будет добавить этот ключ в ключи развертывания в репозитории git. Вот полный рецепт:

  1. генерировать ssh ключи с ssh-keygen -q -t rsa -N '' -f repo-key который даст вам РЕПО и РЕПО-ключ.файлы паба.

  2. добавить РЕПО-ключ.pub к ключам развертывания репозитория.
    На GitHub перейдите в [ваш репозиторий] -> Настройки - > развернуть ключи

  3. добавьте что-то вроде этого в свой Dockerfile:

    ADD repo-key /
    RUN \
      chmod 600 /repo-key && \  
      echo "IdentityFile /repo-key" >> /etc/ssh/ssh_config && \  
      echo -e "StrictHostKeyChecking no" >> /etc/ssh/ssh_config && \  
      // your git clone commands here...
    

обратите внимание, что выше выключается StrictHostKeyChecking, поэтому вам не нужно .СШ/если вы. Хотя мне, вероятно, больше нравится решение с ssh-keyscan в одном из ответов выше.


нет необходимости возиться с конфигурациями ssh. Используйте файл конфигурации (не Dockerfile), содержащий переменные среды, и обновите файл docker во время выполнения с помощью сценария оболочки. Вы сохраняете токены из своих Dockerfiles, и вы можете клонировать по https (нет необходимости генерировать или передавать ключи ssh).

на Настройки > Личные Маркеры Доступа

  • создать персональный маркер доступа с repo объем включен.
  • клонировать вот так:git clone https://MY_TOKEN@github.com/user-or-org/repo

некоторые комментаторы отметили, что если вы используете общий файл Dockerfile, это может предоставить ключ доступа другим людям в вашем проекте. Хотя это может быть или не быть проблемой для вашего конкретного случая использования, вот несколько способов справиться с этим:

  • используйте сценарий оболочки для принятия аргументов, которые могут содержать ваш ключ в качестве переменной. Замените переменную в Dockerfile на sed или похожие, т. е. вызов скрипта с sh rundocker.sh MYTOKEN=foo что бы заменить на https://{{MY_TOKEN}}@github.com/user-or-org/repo. Обратите внимание, что вы также можете использовать файл конфигурации (в .yml или любой другой формат, который вы хотите), чтобы сделать то же самое, но с переменными среды.
  • создайте пользователя github (и создайте токен доступа для) только для этого проекта

для репозитория bitbucket создайте пароль приложения (Настройки Bitbucket -> управление доступом -> пароль приложения, см. изображение) с доступом для чтения к РЕПО и проекту.

bitbucket user menu

тогда команда, которую вы должны использовать:

git clone https://username:generated_password@bitbucket.org/reponame/projectname.git

другой вариант-использовать многоступенчатую сборку docker, чтобы убедиться, что ваши SSH-ключи не включены в окончательный образ.

как описано в моем в должности вы можете подготовить промежуточное изображение с необходимыми зависимостями для git clone, а затем COPY необходимые файлы в ваше окончательное изображение.

кроме того, если мы LABEL наши промежуточные слои, мы можем даже удалить их из машины, когда закончим.

# Choose and name our temporary image.
FROM alpine as intermediate
# Add metadata identifying these images as our build containers (this will be useful later!)
LABEL stage=intermediate

# Take an SSH key as a build argument.
ARG SSH_PRIVATE_KEY

# Install dependencies required to git clone.
RUN apk update && \
    apk add --update git && \
    apk add --update openssh

# 1. Create the SSH directory.
# 2. Populate the private key file.
# 3. Set the required permissions.
# 4. Add github to our list of known hosts for ssh.
RUN mkdir -p /root/.ssh/ && \
    echo "$SSH_KEY" > /root/.ssh/id_rsa && \
    chmod -R 600 /root/.ssh/ && \
    ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts

# Clone a repository (my website in this case)
RUN git clone git@github.com:janakerman/janakerman.git

# Choose the base image for our final image
FROM alpine

# Copy across the files from our `intermediate` container
RUN mkdir files
COPY --from=intermediate /janakerman/README.md /files/README.md

мы можем build:

MY_KEY=$(cat ~/.ssh/id_rsa)
docker build --build-arg SSH_KEY="$MY_KEY" --tag clone-example .

докажите, что наши SSH-ключи исчезли:

docker run -ti --rm clone-example cat /root/.ssh/id_rsa

очистите промежуточные изображения от машины сборки:

docker rmi -f $(docker images -q --filter label=stage=intermediate)