¿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"?

Mandragor
fuente
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.

VonC
fuente
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"]
Provincia de Kos
fuente
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.

Michele Minno
fuente
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
4

No hay forma de deshabilitar un servicio definido en Docker compose yaml file. La sugerencia de VonC es una buena solución. Consulte a continuación la documentación de la ventana acoplable redactar para conocer las opciones disponibles https://docs.docker.com/compose/compose-file/

Shibashis
fuente
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.

herm
fuente
-3

Lo tengo:

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

Primitivo pero agregue un #al principio de cada línea del servicio.

Kjeld Flarup
fuente
3
La pregunta era sobre alternativas a comentar un servicio.
Michael Härtl