es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.
Tags:  , , , ,

Answer

  1. Avatar for 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 comando conda env create.

    Para evitar esto, puede intentar los siguientes pasos:

    1. En su Dockerfile, agregue las siguientes líneas para instalar openssh-client y git y crear un archivo de llave ssh:
      RUN apt-get update && \
         apt-get install -y --no-install-recommends \
             openssh-client \
             git && \
         rm -rf /var/lib/apt/lists/*
      
      RUN mkdir -p /root/.ssh && \
         echo "Host bitbucket.org\n\tStrictHostKeyChecking no\n" >> /root/.ssh/config && \
         ssh-keyscan bitbucket.org > /root/.ssh/known_hosts
      
    2. Ahora puede clonar el repositorio utilizando el archivo de llave ssh dentro del contenedor de Docker. Agregue la siguiente línea después del código anterior para que esté justo después del comando RUN:
      RUN --mount=type=ssh git clone git@bitbucket.org:<username>/<repository>.git /tmp/<local_directory>
      

      Esto clonará el repositorio especificado dentro del contenedor de Docker al directorio especificado /tmp/<local_directory>.

    3. Por último, puede agregar el directorio local a su comando conda env create reemplazando la línea git+ssh://<repository_url> con /tmp/<local_directory> en su archivo environment.yml. Por ejemplo:

      dependencies:
       - pip:
           - /tmp/<local_directory>
      

      Ahora, cuando ejecute el comando conda env create durante la construcción de docker, 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”.

    4. Al ejecutar docker build, puede utilizar la bandera --ssh para especificar la ruta al archivo de llave ssh para autenticarse con BitBucket. Por ejemplo:

      DOCKER_BUILDKIT=1 docker build --ssh default=<path_to_ssh_key> .
      

      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.

Comments are closed.