Compose: Usando el comando de shell en docker-compose.yml

Creado en 27 oct. 2016  ·  41Comentarios  ·  Fuente: docker/compose

Hola, ¿hay alguna forma de usar comandos de shell en el archivo docker-compose.yml ?
Aquí está mi caso de uso:

 version: '2'
 services:
   ci:
     image: jenkins
     volumes:
       - ./data:/var/jenkins_home
       - /var/run/docker.sock:/var/run/docker.sock
       - $(command -v docker):/usr/bin/docker
     groupadd:
       - $(stat -c %g /var/run/docker.sock)
     ports:
       - "8080:8080"
       - "50000:50000"

Actualmente me está dando este error:

ERROR: Invalid interpolation format for "volumes" option in service "ci": "${command -v docker}:/usr/bin/docker"
kinquestion

Comentario más útil

Sería muy útil tener ...

Todos 41 comentarios

Hola @zkanda ,

Lo sentimos, esto no es algo que apoyamos. Por lo general, esto se hace configurando variables de entorno y utilizando la sustitución de variables dentro del archivo Compose.

@ shin- gracias, puedo solucionarlo con variables de entorno. También .env parece muy útil.
Documentos relevantes: https://docs.docker.com/compose/environment-variables/#/the -env-file

@zkanda , ¿alguna vez .env

DOCKER_BIN=`which docker`

y luego en el docker-compose.yml

jenkinsmaster:
  build: jenkins-master
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock
    - ${DOCKER_BIN}:/usr/bin/docker
  ports:
    - "50000:50000"

Pero sigo recibiendo

Cannot create container for service jenkinsmaster: create `which docker`: "`which docker`" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed.

Entonces, ¿parece que los comandos se interpretan como cadenas en el archivo .env ?

Los comandos no son expandidos por Compose, en .env ni en ningún otro lugar.

Sería muy útil tener ...

+1

He aquí un caso de uso. Al configurar Kafka, necesita la IP de la máquina host. Tengo el siguiente script para conseguirlo:

DOCKER_HOST_IP=$(ifconfig | grep 'inet .*br' | sed -E 's/.*inet (.*) netmask.*/\1/')

Hago referencia a esa IP en el env. Ya no puedo simplemente ejecutar docker-compose up porque necesito ejecutar eso de antemano. Y necesito informar a los otros desarrolladores del equipo de esto.

+1

Sería útil para obtener el usuario actual, como en:

services:
  foo:
    image: bar:latest
    user: ${CURRENT_USER-$(id -u):$(id -g)}

También debe haber otros casos de uso ...

Por cierto, no entiendo el hecho de que ${BAZ-default} funciona en Compose si no podemos ejecutar el resto de las funcionalidades de Bash ... (hasta donde yo sé, el - es una de las funcionalidades de manipulación de variables de Bash, como sustitución con ${VAR/search/replace} , por ejemplo)

@ davi5e ... Lo que estaba intentando:

version: "3.7"

services:
  orchestrator:
    build: .
    ports:
      - "2000:2000"
    # Use type host until we can test link
    network_mode: "host"
    environment:
      - NODE_ENV=development
      - LOCAL_USER_ID=${id -u}

@ davi5e otro caso de uso es cuando desea crear un volumen de docker y vincularlo a su directorio de repositorio de git. Este baño absoluto desconfiará de cada desarrollador del equipo.

+1
Por favor, vuelva a abrir el problema

+1
mi caso de uso es publicar un rango de puertos que se determina como una función de un puerto "base"

Sería muy útil tener esto para configurar las variables UID / GID, ya que es prácticamente un requisito para usar Docker en un entorno de desarrollo (sin necesidad de usar scripts para configurarlo en un archivo .env).

+1

Podría usar esto para etiquetar / etiquetar las imágenes generadas por Docker componer con la etiqueta git y confirmar el hash:

En .env :

GIT_VERSION=$(git describe --always --dirty --abbrev)
OUTER_PORT=6970

En docer-complse.yml :

version: '3'
services:
  nginx:
    restart: always
    build:
        context: ./nginx
        labels:
          org.label-schema.schema-version: "1.0"
          org.label-schema.version: "${GIT_VERSION}"
          org.lavel.schema.url: "https://mydocu-server.company.com/vcs/${GIT_VERSION}"
    ports:
      - ${OUTER_PORT}:8080

Para aquellos que hacen esto en desarrollo, si su shell establece la variable UID , puede pasarla al construir la imagen de desarrollo local. Dado que la imagen de desarrollo local no se comparte, no tiene que preocuparse por los conflictos de fluidos con sus compañeros de trabajo.

+1

@ con-f-use Haciendo eso solo enviará el comando real y no el resultado de mi prueba, el único truco que he tenido éxito hasta ahora es escribir un script que envuelve la ventana acoplable compose que configura la variable de entorno.

+1

TL; DR si desea exportar esas variables desde .env archivo:

# set the path of .env file here
ENV_FILE="${ENV_FILE:-local.env}"
while IFS= read -r line; do
  export "$line"
done < <( grep --color=never -E -v -e '^#' -e '^[[:space:]]*$' "${ENV_FILE}" )

Cómo utilizar:

  • Escríbalo en su línea de comando y presione enter para modificar su entorno de shell actual

O

  • Guárdalo como script bash y obtén el origen

Advertencias:

  • Guardar esto como un script y ejecutarlo no exportará mágicamente esas variables en su entorno de shell actual. Tendrá que obtenerlo o hacer algo elegante eval .
  • (¿Quizás algo bueno?) Sobrescribirá las variables existentes con el mismo nombre en $ENV_FILE

Explicación: aquí

Eche un vistazo a direnv para automatizar todo eso https://direnv.net/

El viernes 28 de junio de 2019 a las 12:57 p.m. Sudarshan Wadkar [email protected]
escribió:

TL; DR si desea exportar esas variables del archivo .env:

establezca la ruta del archivo .env aquí

ENV_FILE = "$ {ENV_ FILE: -local.env }" while IFS = read -r línea; hacer
exportar "$ line" hecho <<(grep --color = nunca -E -v -e '^ #' -e '^ [[: espacio:]] * $' "$ {ENV_FILE}")

Cómo utilizar:

  • Escríbalo en su línea de comando
  • Guárdalo como script bash y obtén el origen

Advertencias:

  • Guardar esto como un script y ejecutarlo no exportará mágicamente esos
    variables en su entorno de shell actual. Tendrás que buscarlo o hacerlo
    alguna evaluación elegante.
  • (¿Quizás algo bueno?) Sobrescribirá las variables existentes con las mismas
    nombre en $ ENV_FILE

Explicación: aquí
https://explainshell.com/explain?cmd= while+IFS%3D+read+-r+line%3B+do+export+%22%24line%22%3B+done+%3C+%3C%28grep+--color%3Dno+ -v + -e +% 27% 5E% 23% 27 + -e +% 27% 5E% 5B% 5B% 3Aspace% 3A% 5D% 5D *% 24% 27 +% 24% 7BENV_FILE% 7D% 29

-
Estás recibiendo esto porque estás suscrito a este hilo.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/docker/compose/issues/4081?email_source=notifications&email_token=AACHRDBQXQZTC5FXTOFL6UTP4XOBJA5CNFSM4CUISSSKYY3PNVWWK3TUL52HS4DFVREXG43VMVODBW63WTR2COMM50 ,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/AACHRDGJ6FAQBEDLBSRVS6TP4XOBJANCNFSM4CUISSSA
.

Sí, direnv es bueno, pero no estoy seguro de si será útil con el archivo .env Docker, que tiene líneas simples con sintaxis VAR=VAL simple (según este enlace). La idea es que el archivo .env está comprometido con el repositorio y el script de compilación puede ejecutarlo en mi local o docker-compose puede ejecutarlo en la etapa de preparación / implementación.

Realmente no hay variables de entorno
https://en.wikipedia.org/wiki/Environment_variable si forman parte de
el código base y no parte del entorno ...

El viernes 28 de junio de 2019 a las 2:04 p.m. Sudarshan Wadkar [email protected]
escribió:

Sí, direnv es bueno, pero no estoy seguro de si será útil con Docker
archivo .env que tiene líneas simples con sintaxis VAR = VAL simple (según esto
https://docs.docker.com/compose/env-file/#syntax-rules link.) La idea
siendo el archivo .env está comprometido con el repositorio y el script de compilación puede
ejecutarlo en mi local o docker-compose puede ejecutarlo en la etapa de preparación / implementación.

-
Estás recibiendo esto porque estás suscrito a este hilo.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/docker/compose/issues/4081?email_source=notifications&email_token=AACHRDCEKOMK2VI3A43QBC3P4XV5BA5CNFSM4CUISSSKYY3PNVWWK3TUL52HS4DFVREXG43VMVODBW63WL2DFVREXG43VMVODBW63WLNMZDZDVMDX5HBWL2
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/AACHRDF3Q3YOZPHUIUZYEPTP4XV5BANCNFSM4CUISSSA
.

Ah, vale.

Me gusta pensar que el archivo .env convierte en una variable de entorno cuando ejecuta docker-compose up .

Mi caso de uso fue usar el mismo archivo .env como fuente de verdad para ejecutar una instancia de desarrollo local (posiblemente sin la ayuda de docker-compose ). Así que sí, tal vez esas líneas en el archivo .env no sean realmente variables de entorno, pero seguramente se convertirán en una cuando implementes.

Todavía no veo cómo direnv va a ayudar en ese caso.

Otro caso de uso es poner un comando que genere una contraseña asignándola a env var en el contenedor.
De esta forma, la contraseña no se escribiría en archivos .env o docker-compose.yml.

Creo que esto será un gran beneficio para muchos casos de uso relacionados con la seguridad.

+1

+1

+1, sería muy útil para configurar uid y gid sin complicar demasiado la solución

''
/ _ / \
(oo)

^ <`` `

+1 Tengo un caso de uso como se mencionó anteriormente para agregar git branch y confirmar en el archivo de composición que eventualmente irá al archivo docker y luego se agregará como una versión en el manifiesto del jar construido en una etapa de un proceso de compilación de docker de múltiples etapas .

  gateway:
    image: name
    build:
      context: ./project
      dockerfile: build/Dockerfile
      args:
        - GIT_COMMIT=${$(git rev-list -1 HEAD):-unspecified}
        - GIT_DATE=${$(git log -1 --date=short --pretty=format:%ct):-unspecified}

Entonces, actualmente, para 7 proyectos en mi archivo de redacción, tengo que configurar entornos 7x2. Triste.

@ shin- ¿Podrías volver a abrir esto como una solicitud de función? Parece que no se ha resuelto con buenas soluciones y existe una sólida necesidad para ello.

+1 Probablemente podría haber logrado esto de una manera diferente, pero necesitaba activar el motor de la ventana acoplable desde dentro de un contenedor para reiniciar un contenedor vecino. En el caso de que mi certificado Letsencrypt esté vencido, pero necesito reiniciar el contenedor NGinx después de la renovación. El problema es, ¿cómo le digo a docker-compose dentro del contenedor cuál es el nombre del proyecto para este grupo de contenedores? PROJECT=(basedir ~+) . Está codificado manualmente por ahora :(

+1 a esa solicitud de función
Otro caso de uso es capturar secretos de un cli / http (por ejemplo, bóveda, 1Password) y conectarse al entorno.
es decir

...
    environment:
      - SERVICE_USERNAME=$(vault kv get -field=username kv/service/credentials)
      - SERVICE_PASSWORD=$(vault kv get -field=password kv/service/credentials)
...

Tengo la misma necesidad que @rafaelbattesti , excepto que estoy usando lastpass.

...
     environment:
         - TRPASSWD=$(lpass show --password Transmission)
....

+1

+1

@ shin- ¿Podrías volver a abrir esto como una solicitud de función? Parece que no se ha resuelto con buenas soluciones y existe una sólida necesidad para ello.

@ four43 , tal vez @ shin- ¿u otros no leen los comentarios sobre temas cerrados? ¿Abrimos otro para llamar la atención?

La expansión variable en el archivo docker-compose sería una característica muy útil para tener ...

+1

@esale - Sí, supongo que depende. Pude ver que está fuera del alcance de este caso. No se exceda con DSL demasiado. ¿En ese punto la plantilla del archivo Docker-compose con alguna otra herramienta? ¿Estamos cruzando demasiado las preocupaciones?

Si está utilizando un archivo .env, puede reemplazar la salida del shell por un comando como este

eval "echo \"$(cat .env.example)\"" > .env

Ejemplo de archivo .env.example

DOCKER_BIN=$(which docker)
DOCKER_COMPOSE_BIN=$(which docker-compose)

Crea el archivo .env

DOCKER_BIN=/snap/bin/docker
DOCKER_COMPOSE_BIN=/snap/bin/docker-compose
¿Fue útil esta página
0 / 5 - 0 calificaciones