Instalar un paquete personalizado desde BitBucket con SSH sin ingresar la contraseña de SSH durante la construcción de Docker.
Estoy intentando instalar (a través de un comando conda env create
) un paquete personalizado de Python desde BitBucket durante un comando docker build
sin ingresar la contraseña/ frase de contraseña SSH. Esta pregunta es similar a [esta otra pregunta] (https://stackoverflow.com/questions/70027258/pip-install-custom-package-from-bitbucket-with-ssh-without-entering-ssh-password), pero diferente porque el error ocurre durante el comando docker build
.
El archivo environment.yml
para el comando conda env create
(durante el docker build
) se ve algo así:
name: my_app
channels:
– defaults
dependencies:
– pip=21.2.2
– python=3.8.11
– pip:
– git+ssh://git@bitbucket.org/my_org/my_package_repo.git
– pandas==1.2.5
– python-dotenv==0.19.0
– xlrd==2.0.1
prefix: /usr/local/anaconda3/envs/my_app
Cuando docker build
intenta construir el ambiente conda dentro de la imagen Docker, obtengo este error:
Installing pip dependencies: …working… Pip subprocess error:
Running command git clone -q ‘ssh://****@bitbucket.org/my_org/my_package_repo.git’ /tmp/pip-req-build-3t5mkmnw
Host key verification failed.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
WARNING: Discarding git+ssh://****@bitbucket.org/my_org/my_package_repo.git. Command errored out with exit status 128: git clone -q 'ssh://****@bitbucket.org/my_org/my_package_repo.git' /tmp/pip-req-build-3t5mkmnw Check the logs for full command output.
ERROR: Command errored out with exit status 128: git clone -q 'ssh://****@bitbucket.org/my_org/my_package_repo.git' /tmp/pip-req-build-3t5mkmnw Check the logs for full command output.
Ran pip subprocess with arguments:
['/opt/conda/envs/work_content/bin/python', '-m', 'pip', 'install', '-U', '-r', '/tmp/condaenv.9p_rq9_h.requirements.txt']
Pip subprocess output:
Collecting git+ssh://****@bitbucket.org/my_org/my_package_repo.git (from -r /tmp/condaenv.9p_rq9_h.requirements.txt (line 3))
Cloning ssh://****@bitbucket.org/my_org/my_package_repo.git to ./pip-req-build-3t5mkmnw
failed
CondaEnvException: Pip failed
Este paquete personalizado remoto se instala correctamente cuando estoy en mi terminal y sigo la respuesta en la pregunta de referencia de StackOverflow. Sin embargo, cuando intento hacer lo mismo antes de ejecutar el comando `docker build`, obtengo el error anterior. Supongo que es porque Docker está construyendo una imagen de sistema operativo completamente nueva y ya no tiene la frase de contraseña RSA SSH que proporcioné en la terminal. ¿Cómo puedo superar este error sin proporcionar la frase de contraseña durante la construcción?
Actualización
Basado en sugerencias en una de las respuestas actuales, he modificado mi `Dockerfile` para que se vea algo así:
```
# syntax=docker/dockerfile:experimental
FROM continuumio/miniconda3:4.10.3
...
RUN apt-get install -y openssh-client git
RUN mkdir -p -m 0600 ~/.ssh && ssh-keyscan bitbucket.org >> ~/.ssh/known_hosts
RUN --mount=type=ssh git clone git@bitbucket.org:my_org/my_package_repo.git /tmp/my_package_repo
```
El comando `--mount` crea una copia local del repositorio en el directorio `/tmp`. Entonces, el archivo `environment.yml` de conda necesita ser modificado para que `pip` instale desde ese directorio local de esta manera:
name: my_app
channels:
- defaults
dependencies:
- pip=21.2.2
- python=3.8.11
- pip:
- /tmp/my_package_repo
- pandas==1.2.5
- python-dotenv==0.19.0
- xlrd==2.0.1
prefix: /usr/local/anaconda3/envs/my_app
... y estoy ejecutando el proceso `docker build` con comandos como estos:
```
eval $(ssh-agent); ssh-add ~/.ssh/id_rsa
DOCKER_BUILDKIT=1 docker build --ssh default .
```
El comando `eval` anterior es para ingresar manualmente mi frase de contraseña SSH antes de que comience la compilación de Docker. El `DOCKER_BUILDKIT=1` delante del comando `docker build` obliga a Docker a construir con Docker Buildkit, que es necesario para el comando `RUN --mount=type=ssh git clone` en el archivo `Dockerfile`. Esta solución funciona para mí ahora. No es exactamente lo que está en la respuesta a continuación, así que pensé en compartir esto con la comunidad. Estoy marcando la respuesta que me señaló en esta dirección como la respuesta correcta.
davy.ai
Solución para instalar paquetes personalizados de BitBucket durante la construcción de Docker
Cuando se realiza una construcción de
docker build
, el proceso de construcción se ejecuta en un entorno separado y no tiene acceso a ninguna contraseña o frase de acceso ingresada en otro lugar. Es por eso que está recibiendo el error “Fallo de verificación de la clave del host” durante el comandoconda env create
.Para evitar esto, puede intentar los siguientes pasos:
openssh-client
ygit
y crear un archivo de llave ssh:RUN
:Esto clonará el repositorio especificado dentro del contenedor de Docker al directorio especificado
/tmp/<local_directory>
.Por último, puede agregar el directorio local a su comando
conda env create
reemplazando la líneagit+ssh://<repository_url>
con/tmp/<local_directory>
en su archivoenvironment.yml
. Por ejemplo:Ahora, cuando ejecute el comando
conda env create
durante la construcción dedocker
, utilizará el clon local del repositorio en lugar de intentar obtenerlo de BitBucket y no recibirá el error “Fallo de verificación de la clave del host”.Al ejecutar
docker build
, puede utilizar la bandera--ssh
para especificar la ruta al archivo de llave ssh para autenticarse con BitBucket. Por ejemplo:Esto autenticará con BitBucket utilizando el archivo de llave ssh especificado durante el proceso de construcción de
docker
.Con estos pasos, debería poder instalar su paquete personalizado de BitBucket durante la construcción de Docker sin tener que ingresar manualmente ninguna contraseña o frase de acceso.