¿Cómo montar volúmenes con docker-compose dentro y fuera de un devcontainer VSCode?

Escenario

El proyecto en el que estoy trabajando (una aplicación React) usa docker-compose para configurarlo es backend, servidor web y frontend. Estoy trabajando dentro de un VSCode devcontainer (Nodo con tipografía).

El Docker en el entorno Docker Me parece que la configuración funciona bien y puedo empezar cada uno de los contenedores Docker pero tuve que adaptar el código de la siguiente manera porque de lo contrario Docker no pudo localizar los volúmenes especificados para montar.

Configuración

Primero necesitaba establecer un variable de entorno remoto en mi devcontainer.json:

"remoteEnv": {
    // the original host directory which is needed for volume mount commands from inside the container (Docker in Docker)
    "LOCAL_WORKSPACE_FOLDER": "${localWorkspaceFolder}"
}

Estoy usando esta variable de entorno en el docker-compose.yaml así:

services: 

  webserver:
      build: 
          context: ./docker
          dockerfile: webserver/Dockerfile
      image: webserver
      container_name: webserver_nginx
      ports:
          - 8080:80
      volumes:
          -  ${LOCAL_WORKSPACE_FOLDER}/webserver:/etc/nginx/conf.d
          -  ${LOCAL_WORKSPACE_FOLDER}/build:/var/www/html
      restart: unless-stopped
      depends_on: 
        - backend

  backend:
      ...

Problema

En mi máquina (y en la máquina de mis colegas que también utilizan VSCode) todo funciona bien. Pero tengo algunos equipos que no usan VSCode. Cuando comprobé la adaptación docker-compose.yaml archivo, su configuración ya no funciona y viceversa si adaptan el archivo de nuevo a sus necesidades.

Pregunta

¿Cómo puedo asegurarme de que Docker compose funciona dentro y fuera de VSCode devcontainers?

¿ Posibles soluciones?

  • ¿Sería posible establecer la variable ambiente a un valor predeterminado? Porque en mi caso el valor real que debe establecerse si el proyecto no se abre dentro de un devcontainer es sólo un punto simple (.). Porque cuando ejecuto el comando echo ${LOCAL_WORKSPACE_FOLDER} dentro de la terminal VSCode integrada, la ruta correcta se imprime. Así que parece que VSCode sólo establece variables ambientales normales?

  • (Si la suposición de arriba es correcta) no sería posible escribir un sencillo script Bash install.sh ¿Ese set es el camino correcto automáticamente? Este script sólo debe ejecutarse una vez durante la configuración del proyecto. ¿Cómo puede parecer este archivo?

Pregunta hecha hace 3 años, 4 meses, 29 días - Por algorithmarchitect


3 Respuestas:

  • Docker compose permite valor predeterminado para variables:

    ${VARIABLE:-default} evalúa por defecto si VARIABLE es inestable o vacío en el medio ambiente.

    Véase: https://docs.docker.com/compose/environment-variables/

    Para usted ejemplo de caso, puede utilizar:

    ¿Por qué?

    PS: Nunca usé esa persona

    Respondida el Dec 17, 2020 a las 15:30 - por pixelpioneerc4b5

    Votos positivos: 0 | Votos negativos: 0

  • Para asegurarte de que tu configuración de Docker Compose funcione tanto dentro como fuera de los contenedores de desarrollo de VSCode, puedes seguir algunas recomendaciones:

    • Establecer la variable de entorno a un valor predeterminado:
    Puedes establecer la variable LOCAL_WORKSPACE_FOLDER en tu devcontainer.json con un valor predeterminado en caso de que no se esté ejecutando dentro de un contenedor de desarrollo de VSCode. Por ejemplo, podrías establecerlo en . cuando esté fuera de VSCode, y usar el valor real cuando esté dentro de VSCode. De esta forma, tu archivo docker-compose.yaml seguirá funcionando en ambos escenarios.

    • Crear un script install.sh para configurar el entorno:
    Puedes crear un script Bash install.sh que establezca la variable de entorno LOCAL_WORKSPACE_FOLDER al valor correspondiente dependiendo de si se está ejecutando dentro de un contenedor de desarrollo de VSCode o no. Este script podría detectar automáticamente si se encuentra dentro de un contenedor y ajustar la variable en consecuencia.

    Aquí tienes un ejemplo simple de cómo podría ser el script install.sh:

    bash
    !/bin/bash
    

    Check if running inside a devcontainer

    if [ -f /.devcontainer ]; then export LOCAL_WORKSPACE_FOLDER="${localWorkspaceFolder}" else export LOCAL_WORKSPACE_FOLDER="." fi

    Optionally print the value of LOCAL_WORKSPACE_FOLDER for verification

    echo "LOCAL_WORKSPACE_FOLDER: $LOCAL_WORKSPACE_FOLDER"

    You may run your docker-compose commands or any other setup steps here

    Este script puede ejecutarse una vez durante la configuración del proyecto para asegurarse de que la variable de entorno esté correctamente configurada.

    Recuerda que también puedes evaluar otras opciones o variaciones de este enfoque dependiendo de tus necesidades específicas y la complejidad de tu proyecto.

    Respondida el Dec 18, 2020 a las 15:31 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Solución 1: Establecer la variable de entorno a un valor predeterminado

    Sí, es posible establecer la variable de entorno a un valor predeterminado. Puedes utilizar el siguiente código en tu docker-compose.yaml:

    yaml
    services:
      webserver:
        ...
        environment:
          LOCAL_WORKSPACE_FOLDER: ${LOCAL_WORKSPACE_FOLDER:-.}
        ...
    

    Esto establecerá la variable LOCAL_WORKSPACE_FOLDER a su valor actual si se establece, y a "." si no lo está.

    Solución 2: Crear un script de instalación

    También puedes crear un script de instalación que establezca la variable de entorno correctamente. Aquí tienes un ejemplo de archivo install.sh:

    bash
    !/bin/bash
    

    Comprueba si la variable LOCAL_WORKSPACE_FOLDER está establecida

    if [ -z "${LOCAL_WORKSPACE_FOLDER}" ]; then

    Si no está establecida, intenta obtenerla del entorno de VSCode

    export LOCAL_WORKSPACE_FOLDER=$(code --list-extensions | grep remote.containers | awk '{print $NF}' | sed 's/}//g') fi

    Si la variable sigue sin estar establecida, establece un valor predeterminado

    if [ -z "${LOCAL_WORKSPACE_FOLDER}" ]; then export LOCAL_WORKSPACE_FOLDER=. fi

    Puedes ejecutar este script durante la configuración del proyecto. Por ejemplo, puedes agregarlo a tu package.json y ejecutarlo con el siguiente comando:

    
    npm run setup
    

    Consideraciones adicionales:

    Si estás usando un editor diferente a VSCode, es posible que necesites adaptar el comando para obtener la ruta del espacio de trabajo. Es posible que también necesites ajustar los volúmenes montados en tu docker-compose.yaml para que coincidan con la ruta correcta.

    Respondida el Dec 18, 2020 a las 15:37 - por Gemini

    Votos positivos: 0 | Votos negativos: 0