tag - Clon privado git repo con dockerfile
docker push tag to registry (5)
He copiado este código de lo que parecen ser varios archivos docker en funcionamiento, 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 archivos docker, pero por lo que he leído (y tomado de las configuraciones de trabajo) no puedo ver por qué esto no funciona.
Mi id_rsa está en la misma carpeta que mi archivo docker y es una copia de mi clave local que puede clonar este repositorio sin problemas.
Editar:
En mi dockerfile puedo agregar:
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 Noah aconsejó y corrí:
RUN echo "Host bitbucket.org/n/tIdentityFile /root/.ssh/id_rsa/n/tStrictHostKeyChecking no" >> /etc/ssh/ssh_config
Lamentablemente esto tampoco funciona.
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, deberá agregar esa clave a las claves de implementación en su repositorio git. Aquí está la receta completa:
Genere claves ssh con
ssh-keygen -q -t rsa -N '''' -f repo-key
que le dará los archivos repo-key y repo-key.pub.Agregue repo-key.pub a sus claves de implementación del repositorio.
En GitHub, vaya a [su repositorio] -> Configuración -> Implementar clavesAgrega algo como esto a tu 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 necesita .ssh / known_hosts. Aunque probablemente me guste más la solución con ssh-keyscan en una de las respuestas anteriores.
Mi clave estaba protegida con una contraseña que estaba causando el problema, un archivo de trabajo ahora se lista 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
No hay necesidad de jugar con configuraciones ssh. Utilice un archivo de configuración (no un archivo Docker) que contenga variables de entorno, y haga que un script de shell actualice su archivo de ventana acoplable en tiempo de ejecución. Mantiene los tokens fuera de sus Dockerfiles y puede clonar sobre https (no es necesario generar ni pasar claves ssh).
Vaya a Configuración> Tokens de acceso personal
- Generar un token de acceso personal con alcance de
repo
habilitado. - Clone así:
git clone https://[email protected]/user-or-org/repo
Algunos comentadores han notado que si usa un Dockerfile 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 formas 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, llame al script consh rundocker.sh MYTOKEN=foo
que reemplazaría enhttps://{{MY_TOKEN}}@github.com/user-or-org/repo
. Tenga en cuenta que también podría usar un archivo de configuración (en .yml o el formato que desee) para hacer lo mismo pero con variables de entorno. - Cree un usuario github (y genere un token de acceso para) solo para ese proyecto
Otra opción es utilizar una construcción de ventana acoplable 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 clonar y luego COPY
los archivos requeridos 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
Entonces podemos construir:
MY_KEY=$(cat ~/.ssh/id_rsa)
docker build --build-arg SSH_KEY="$MY_KEY" --tag clone-example .
Demuestra que nuestras claves SSH se han ido:
docker run -ti --rm clone-example cat /root/.ssh/id_rsa
Limpie las imágenes intermedias de la máquina de construcción:
docker rmi -f $(docker images -q --filter label=stage=intermediate)
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.
Entonces el comando que debes usar es:
git clone https://username:[email protected]/reponame/projectname.git