Clonar repositorio git privado con dockerfile


He copiado este código de lo que parecen ser varios archivos docker de trabajo alrededor, aquí está el mío:

FROM ubuntu

MAINTAINER Luke Crooks "[email protected]"

# 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 [email protected]:Pumalo/docker-conf.git /home/docker-conf

Esto me da el error

Step 10 : RUN git clone [email protected]: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 [email protected]:Pumalo/docker-conf.git /home/docker-conf] returned a non-zero code: 128

Esta es la primera vez que uso dockerfiles, pero por lo que he leído (y tomado de configuraciones de trabajo) no puedo ver por qué esto no funciona.

Mi id_rsa está en la misma carpeta que mi dockerfile y es una copia de mi clave local que puede clonar este repositorio sin problema.

Editar:

En mi dockerfile puedo añadir:

RUN cat /root/.ssh/id_rsa

E imprime la clave correcta, así que sé que se está copiando correctamente.

También he tratado de hacer lo que Noé aconsejó y corrió:

RUN echo "Host bitbucket.org\n\tIdentityFile /root/.ssh/id_rsa\n\tStrictHostKeyChecking no" >> /etc/ssh/ssh_config

Esto lamentablemente tampoco funciona.

Author: Samuel Bolduc, 2014-04-30

5 answers

Mi clave estaba protegida por contraseña lo que estaba causando el problema, un archivo de trabajo ahora se enumeran a continuación (para ayuda de futuros googlers)

FROM ubuntu

MAINTAINER Luke Crooks "[email protected]"

# 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 [email protected]:User/repo.git
 253
Author: crooksey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-17 14:22:31

Debe crear un nuevo conjunto de claves SSH para esa imagen de Docker, ya que probablemente no desee incrustar allí su propia clave privada. Para que funcione, tendrás que agregar esa clave a las claves de implementación en tu repositorio git. Aquí está la receta completa:

  1. Genere claves ssh con ssh-keygen -q -t rsa -N '' -f repo-key que le darán repo-key y repo-key.archivos de pub.

  2. Añadir repo-key.publicar las claves de implementación de su repositorio.
    En GitHub, ve a [tu repositorio] - > Configuración - > Implementar teclas

  3. Agregue algo como esto a su 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...
    

Tenga en cuenta que lo anterior desactiva StrictHostKeyChecking, por lo que no es necesario .ssh / known_hosts. Aunque probablemente me gusta más la solución con ssh-keyscan en una de las respuestas anteriores.

 79
Author: Marcin R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-28 23:27:16

No hay necesidad de jugar con configuraciones ssh. Utilice un archivo de configuración (no un archivo Dockerfile) que contenga variables de entorno y haga que un script de shell actualice el archivo docker en tiempo de ejecución. Mantén los tokens fuera de tus Dockerfiles y puedes clonar a través de https (sin necesidad de generar o pasar claves ssh).

Vaya a Ajustes > Tokens de acceso personal

  • Genere un token de acceso personal con el ámbito repo habilitado.
  • Clonar así: git clone https://[email protected]/user-or-org/repo

Algunos comentaristas han notado que si usa un archivo Docker compartido, esto podría exponer su clave de acceso a otras personas en su proyecto. Si bien esto puede o no ser una preocupación para su caso de uso específico, aquí hay algunas maneras en que puede lidiar con eso:

  • Use un script de shell para aceptar argumentos que podrían contener su clave como una variable. Reemplace una variable en su Dockerfile con sed o similar, es decir, llamando al script con sh rundocker.sh MYTOKEN=foo que reemplazaría a https://{{MY_TOKEN}}@github.com/user-or-org/repo. Nota que también podría utilizar un archivo de configuración (in .yml o el formato que quieras) para hacer lo mismo pero con variables de entorno.
  • Crear un usuario de github (y generar un token de acceso para) para ese proyecto solamente
 59
Author: Calvin Froedge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-08 16:40:11

Para el repositorio de bitbucket, genere la contraseña de la aplicación (Configuración de Bitbucket -> Administración de acceso -> Contraseña de la aplicación, vea la imagen) con acceso de lectura al repositorio y al proyecto.

menú de usuario de bitbucket

Entonces el comando que debe usar es:

git clone https://username:[email protected]/reponame/projectname.git
 10
Author: Nomce,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-09 21:32:50

Otra opción es usar una compilación de docker de varias etapas para asegurarse de que sus claves SSH no estén incluidas en la imagen final.

Como se describe en mi post puede preparar su imagen intermedia con las dependencias necesarias para git clone y luego COPY los archivos necesarios en su imagen final.

Además, si LABEL nuestras capas intermedias, incluso podemos eliminarlas de la máquina cuando hayamos terminado.

# 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 [email protected]: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

Podemos entonces construir:

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

Probar nuestro SSH las llaves se han ido:

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

Limpiar imágenes intermedias de la máquina de construcción:

docker rmi -f $(docker images -q --filter label=stage=intermediate)
 1
Author: jaker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-30 21:24:04