Tenemos una herramienta que necesita clonar varios repositorios de Git para agregar datos de documentación. Queremos poner esa herramienta en un contenedor Docker para ejecutarla fácilmente localmente y con Jenkins, y permitir la reproducibilidad.
Los repositorios de Git están alojados en un servidor privado que requiere autenticación con claves SSH. Por lo tanto, el contenedor Docker debe obtener acceso de alguna manera a las claves SSH del usuario que ejecuta el contenedor.
Tenemos una lista de restricciones:
Dockerfile no permite la reproducibilidad, mientras que una imagen de Docker ya generada sí.root-v , -u , …)Pregunta: ¿Cómo podemos lograr esto, si es posible?
Relacionada:
root )Puedes usar algo como:
echo "git-user:x:$(id -u):$(id -g):Git User:/tmp:/bin/bash" > /tmp/fake_passwd # See below why to use this docker run \ -u $(id -u):$(id -g) \ -w /tmp \ -v $HOME/.ssh:/path/to/.ssh \ -v /tmp/fake_passwd:/etc/passwd \ --entrypoint sh \ -it \ alpine/git # commands in the container: $ export GIT_SSH_COMMAND='ssh -i /path/to/.ssh/id_rsa -o "StrictHostKeyChecking=no"' $ git clone [path to git repo]Esto asegurará que el contenedor se ejecute con el mismo UID/GID que el usuario del host, pudiendo así leer las claves sin cambiar sus permisos o usar derechos de root. En detalles:
-u $(id -u):$(id -g) establece el usuario del contenedor para que coincida con el usuario del host-w /tmp nos aseguramos de trabajar en un directorio en el que podamos escribir (también podemos montar un volumen en el que tengamos permisos de lectura/escritura o construir la imagen con dicho directorio)-v $HOME/.ssh:/path/to/.ssh monta la clave SSH del usuario local desde el host--entrypoint sh y -it son específicos de alpine/git para tener una sesión de shell interactiva, es posible que no la necesite con su imagen/etc/passwd falso? Cuando ejecuta un contenedor basado en Linux (como alpine o debian ) con un UID/GID desconocido (uno que no está presente en /etc/passwd ), el comando git clone puede generar un error con un mensaje como:
Cloning into 'myrepo'... No user exists for uid 1000 fatal: Could not read from remote repository.Al montar este archivo passwd "falso", nos aseguramos de que el sistema operativo reconozca al usuario que ejecuta el contenedor y permita que funcione nuestro comando git clone. Nuestro archivo de contraseña se verá así:
git-user:x:1000:1000:Git User:/tmp:/bin/bashLo que significa aproximadamente:
git-user existe con UID 1000 y GID 1000/tmp (es opcional pero este directorio es escribible y evita alguna advertencia de git clone ) Al configurar /tmp (u otro directorio que se pueda crear durante la creación de la imagen), nos aseguramos de tener un directorio HOME grabable para git-user que evitará una advertencia de git clone diciendo que no se pudo crear un directorio .ssh
Sin embargo, esto puede tener otros efectos secundarios si tiene la intención de ejecutar diferentes tareas con su contenedor.
GIT_SSH_COMMAND ? GIT_SSH_COMMAND='ssh -i /path/to/.ssh/id_rsa' asegurará que git clone esté usando nuestra clave, pero esto también se puede hacer usando ssh-agent - consultehttps://serverfault.com/questions/447028/ no interactivo-git-clone-ssh-fingerprint-prompt
En el ejemplo, uso -o "StrictHostKeyChecking=no" pero puede ser inseguro , otra solución sería montar un archivo de host conocido en el contenedor con la clave de host del servidor git repo y usar -o "UserKnownHostsFile=/path/to/KnownHostFile"
¿Estaría bien clonar los repositorios en la máquina host y montar los directorios en la imagen de la ventana acoplable?
p.ej :
git clone github:repo1 git clone github:repo2 ... docker run -v repo1:/path/to/repo1 -v repo2:/path/to/repo2 ...