¿Hay alguna forma de deshabilitar un servicio en docker-compose.yml?


84

Me encuentro en la situación de que quiero deshabilitar un servicio temporalmente en un docker-composearchivo.

Por supuesto que podría comentarlo, pero ¿hay alguna opción para decir " enabled: false"?


3
La respuesta es: "depende" ... de lo que esté tratando de lograr. Si lo ejecuta docker-compose up, se iniciarán todos los servicios por defecto. Sin embargo, si lo ejecuta docker-compose up myservice, se iniciará mi servicio y las cosas que dependen de él. Al configurar las dependencias, puede hacer que el servicio defectuoso no comience con este comando. También puede hacer docker-compose runpara obtener solo los servicios que desea. La elección correcta también puede ser dividir esto en varios archivos de redacción para permitirle la flexibilidad que necesita.
Paul Becotte

Para manejar una necesidad similar que tenía, juego con depend_on y el argumento de servicio en docker-compose up , o la opción --no-depsen caso de que no desee iniciar las dependencias. Sé que no es lo que estás buscando, pero es al revés.
Gonzalo

Otra opción es crear tantos archivos de composición acoplable como necesite y elegir cuál de ellos desea incluir en sus llamadas docker-compose -f docker-compose.yml -f another-docker-compose.yml up -d. Puede verificar la combinación de compose de docker resultante con el comando de configuración :docker-compose -f docker-compose.yml -f another-docker-compose.yml config
Gonzalo


@EshaanBansal No conozco tal característica.
VonC

Respuestas:


40

Simplemente podría redefinir el entrypointocommand para reemplazar dicho comando con algo que no hace nada ( /bin/true)

Eso haría que el contenedor saliera inmediatamente, sin hacer nada.


shadi agrega los siguientes consejos en los comentarios:

Si no desea que el servicio se compile en absoluto, vuelva a definir la clave de compilación para que apunte a una Dockerfileque solo tenga:

FROM tianon/true 
ENTRYPOINT ["/true"]

5andr0 señala en los comentarios la sección de nivel superiorx-disabled: (una extensión similar a un campo)

Mucho más conveniente: mover los servicios para discapacitados a la sección de nivel superior en x-disabled:lugar deservices:

Las secciones con el x-prefijo se analizarán, pero se ignorarán si no se utilizan de la forma prevista como campo de extensión.


14
También agregaría / cambiaría restart: "no"para evitar reinicios infinitos
DUzun

2
Esto no ayuda en el caso de que la razón por la que desee deshabilitar este servicio sea porque el servicio ni siquiera puede iniciarse. En mi caso, postgres no se inicia porque hay otra instancia de postgres ejecutándose y el comando ports causa conflictos. Podría comenzar a cambiar la definición, pero en ese momento comentar todo es más fácil.
blueFast

1
Mucho más conveniente: mover los servicios para discapacitados a la sección de nivel superior en x-disabled:lugar deservices:
5andr0

@ 5andr0 Interesante. ¿Hay documentación para esa sección de composición de ventana acoplable?
VonC

docs.docker.com/compose/compose-file/#extension-fields introducido en v3.4. Las secciones con el prefijo x- se analizarán, pero se ignorarán si no se usan de la forma prevista como campo de extensión
5andr0

55

Puedes hacerlo en un docker-compose.override.yamlarchivo.

Este archivo se lee automáticamente docker-composey se fusiona con el archivo principal docker-compose.yaml.

Si lo tiene excluido de Git, cada desarrollador puede modificar la configuración (con algunas limitaciones) sin cambiar el original docker-compose.yaml.

Por lo tanto, el servicio foose puede deshabilitar ad-hoc redefiniendo su punto de entrada en docker-compose.override.yaml:

version: "3"

services:
  foo:
    entrypoint: ["echo", "Service foo disabled"]

1
Si tiene un "reinicio: a menos que se detenga", etc., comente eso, o se reiniciará continuamente
Andreas

La idea es cambiar el punto de entrada en el archivo de anulación. Si tiene políticas de reinicio, cámbielo a un ciclo de suspensión infinito
Kos Prov

Para aclarar, puede hacer esto en docker-compose.yml como en la respuesta de VonC. Eso sería apropiado si desea registrarlo y compartirlo con otros desarrolladores. Además, el formato de archivo de redacción v1 acepta nombres de servicios (foo en el ejemplo anterior) como claves de nivel superior, en lugar de subclaves de "servicios".
Denis Howe

1
Esta solución funciona muy bien si busca deshabilitar / habilitar un servicio para un entorno particular (por ejemplo, desarrollo / preparación / producción) donde tiene un archivo de anulación diferente especificado para cada entorno con la opción -f.
Justin Emery

con docker-compose v3 podemos usar env para deshabilitar el servicio, es decir: export XXX_ENTRYPOINT=/bin/true luego `entrypoint: [" $ {XXX_ENTRYPOINT: -docker-entrypoint.sh} "]`
qxo

9

Agrego la siguiente línea adicional al servicio que quiero deshabilitar temporalmente:

command: echo "{put your service name here} disabled"

Empieza de todos modos, pero no hace nada.


5
La redefinición commandno tiene ningún efecto en el punto de entrada. En su ejemplo usted confía que el entrypointes bashsupongo. Para hacer esto resistente ((independiente del integrado entrypoint), creo que debe redefinir el punto de entrada, no el comando.
blueFast


2

Escalaría el servicio a 0 réplicas con: deploy: réplicas: 0

Desafortunadamente, como dice la documentación, esto solo funciona con docker swarm.


-3

Lo tengo:

docker-compose up $(yq -r '.services | keys | join(" ")' docker-compose.yml | sed 's/service-name//')

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.