He copiado este código de lo que parecen ser varios dockerfiles de trabajo, 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 las 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 agregar:
RUN cat /root/.ssh/id_rsa
E imprime la clave correcta, así que sé que se está copiando correctamente.
También intenté hacer lo que Noah me aconsejó y corrí:
RUN echo "Host bitbucket.org\n\tIdentityFile /root/.ssh/id_rsa\n\tStrictHostKeyChecking no" >> /etc/ssh/ssh_config
Esto lamentablemente tampoco funciona.
ssh-keyscan
tiene un tiempo de espera predeterminado de 5 segundos que Bitbucket a menudo excedió.ssh-keyscan
ni siquiera informará un error. Así que mejor correRUN ssh-keyscan -T 60 bitbucket.org >> /root/.ssh/known_hosts
para estar a salvo.ssh-keyscan
es un problema? Tengo entendido que simplemente extraerá la clave pública de Github / Bitbucket. ¿Qué alternativa se puede usar para que no termine en una capa?known_hosts
archivo. La gente simplemente vota cosas al azar cuando suenan lo suficientemente alarmantes.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á que agregar esa clave a las claves de implementación en su repositorio git. Aquí está la receta completa:
Genere claves ssh con las
ssh-keygen -q -t rsa -N '' -f repo-key
que obtendrá archivos repo-key y repo-key.pub.Agregue repo-key.pub a las claves de implementación de su repositorio.
En GitHub, vaya a [su repositorio] -> Configuración -> Implementar claves
Agregue algo como esto a su Dockerfile:
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.
fuente
fatal: Could not read from remote repository.
No hay necesidad de jugar con configuraciones ssh. Use un archivo de configuración (no un Dockerfile) que contenga variables de entorno y haga que un script de shell actualice su archivo docker en tiempo de ejecución. Mantiene los tokens fuera de sus Dockerfiles y puede clonar sobre https (no es necesario generar o pasar claves ssh).
Vaya a Configuración> Tokens de acceso personal
repo
alcance habilitado.git clone https://[email protected]/user-or-org/repo
Algunos comentaristas 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:
sed
o similar, es decir, llamando al script con elsh rundocker.sh MYTOKEN=foo
que reemplazaríahttps://{{MY_TOKEN}}@github.com/user-or-org/repo
. Tenga en cuenta que también puede usar un archivo de configuración (en .yml o el formato que desee) para hacer lo mismo pero con variables de entorno.fuente
Settings > Applications
?Otra opción es utilizar una construcción de acoplador de varias etapas para garantizar que sus claves SSH no se incluyan en la imagen final.
Como se describe en mi publicación , 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 tenemos
LABEL
nuestras capas intermedias, incluso podemos eliminarlas de la máquina cuando haya terminado.Entonces podemos construir:
Prueba que nuestras claves SSH se han ido:
Limpie las imágenes intermedias de la máquina de compilación:
fuente
RUN
para no dejar la clave en una capa de imagen anterior. A partir de Docker1.13
, puede usar el argumento--squash
experimental que también eliminaría la clave SSH en sus capas de imagen finales.Para el repositorio de bitbucket, genere la contraseña de la aplicación (configuración de Bitbucket -> Gestió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:
fuente
--recursive
no funcionó. Tuve que ponergit clone
para cada submódulo, lo cual está bien, pero habría sido genial si hubiera funcionado recursivamente.A menudo no desea realizar un
git clone
repositorio privado desde la compilación de la ventana acoplable. Hacer el clon allí implica colocar las credenciales ssh privadas dentro de la imagen para que luego puedan ser extraídas por cualquier persona con acceso a su imagen.En cambio, la práctica común es clonar el repositorio git desde fuera de la ventana acoplable en la herramienta de CI que elija, y simplemente
COPY
los archivos en la imagen. Esto tiene un segundo beneficio: el almacenamiento en caché de la ventana acoplable. El almacenamiento en caché de Docker analiza el comando que se ejecuta, las variables de entorno que incluye, los archivos de entrada, etc., y si son idénticos a una compilación anterior del mismo paso principal, reutiliza esa caché anterior. Con ungit clone
comando, el comando en sí es idéntico, por lo que Docker reutilizará el caché incluso si se cambia el repositorio externo de git. Sin embargo, unCOPY
comando mirará los archivos en el contexto de compilación y podrá ver si son idénticos o si se han actualizado, y usará la memoria caché solo cuando sea apropiado.Si va a agregar credenciales a su compilación, considere hacerlo con una compilación de varias etapas, y solo coloque esas credenciales en una etapa temprana que nunca se etiquete y empuje fuera de su host de compilación. El resultado se ve así:
Más recientemente, BuildKit ha estado probando algunas características experimentales que le permiten pasar una clave ssh como una montura que nunca se escribe en la imagen:
Y puedes construir eso con:
Tenga en cuenta que esto aún requiere que su clave ssh no esté protegida por contraseña, pero al menos puede ejecutar la compilación en una sola etapa, eliminando un comando COPY y evitando que la credencial ssh forme parte de una imagen.
BuildKit también agregó una característica solo para ssh que le permite tener sus claves ssh protegidas con contraseña, el resultado es el siguiente:
Y puedes construir eso con:
Nuevamente, esto se inyecta en la compilación sin escribirse nunca en una capa de imagen, lo que elimina el riesgo de que la credencial se filtre accidentalmente.
Para forzar a Docker a ejecutar
git clone
incluso cuando las líneas anteriores se han almacenado en caché, puede inyectar un ARG de compilación que cambia con cada compilación para romper el caché. Eso parece como:Luego, inyecta ese cambio de arg en el comando de construcción docker:
fuente
Las soluciones anteriores no funcionaron para bitbucket. Me imaginé que esto funciona:
fuente