Quiero iniciar un servicio con docker-compose y mantener el contenedor en ejecución para poder obtener su dirección IP a través de 'docker inspect'. Sin embargo, el contenedor siempre sale inmediatamente después de arrancar.
Intenté agregar "command: [" sleep "," 60 "]" y otras cosas al docker-compose.yml pero cada vez que agrego la línea con "command: ..." no puedo llamar a "docker-compose up" ya que obtendré el mensaje "No se puede iniciar el contenedor ..... Error del sistema: carácter no válido 'k' buscando el comienzo del valor"
También intenté agregar "CMD sleep 60" y todo eso al propio Dockerfile, pero estos comandos no parecen ejecutarse.
¿Existe una manera fácil de mantener vivo el contenedor o de solucionar uno de mis problemas?
EDITAR: Aquí está el archivo de composición que quiero ejecutar:
version: '2'
services:
my-test:
image: ubuntu
command: bash -c "while true; do echo hello; sleep 2; done"
Está funcionando bien Si comienzo esto con docker-compose en OS X, pero si intento lo mismo en Ubuntu 16.04, me da el mensaje de error anterior.
Si intento el enfoque con Dockerfile, el Dockerfile se ve así:
FROM ubuntu:latest
CMD ["sleep", "60"]
Que no parece hacer nada
EDIT 2: Tengo que corregirme, resultó que era el mismo problema con el Dockerfile y el docker-compose.yml: Cada vez que agrego "CMD ..." al Dockerfile O agrego "comando ..." a el archivo de redacción, obtengo el error anterior con el carácter no válido. Si elimino ambos comandos, funciona perfectamente.
fuente
Respuestas:
Para mantener un contenedor en ejecución cuando lo inicia
docker-compose
, use el siguiente comandocommand: tail -F anything
Entonces su docker-compose.yml se convierte en
y puede ejecutar un shell para ingresar al contenedor usando el siguiente comando
docker exec -i -t composename_my-test_1 bash
donde
composename
es el nombre quedocker-compose
antepone a sus contenedores.fuente
exit
para volver a su máquina host. Si está en su host, puede detener el contenedor usando Docker (docker stop composename_my-test_1
) o Docker Compose (docker-compose stop
)./dev/null
sería mejor en su lugar para elanything
comando de cola ref. stackoverflow.com/a/48732671/248616Puede utilizar la
tty
opción de configuración.Nota: Si usa Dockerfile para la imagen y
CMD
en Dockerfile, esta opción no funcionará; sin embargo, puede utilizar laentrypoint
opción en el archivoCMD
de redacción que borra el del Dockerfile.fuente
tail -f /dev/null
. Con esto, puedo ejecutar un entorno de desarrollo en contenedores con una base de datos postgres adjuntadocker-compose up
y ejecutar un shell a través de otra terminal usandodocker exec
.tail -f /dev/null
otail -f anything
, consulte aquí: docs.docker.com/compose/compose-fileSegún el comentario de @aanand en GitHub el 26 de agosto de 2015 , se podría usar
tail -f /dev/null
en docker-compose para mantener el contenedor en ejecución.Ejemplo de docker-compose.yml
¿Por qué este comando?
La única razón para elegir esta opción fue que recibió muchos pulgares hacia arriba en GitHub, pero la respuesta más votada no significa que sea la mejor respuesta. La segunda razón era pragmática, ya que los problemas debían resolverse lo antes posible debido a los plazos.
fuente
docker-compose.yml
docker-compose up -d
desde la terminaldocker ps
para obtener la identificación o el nombre del contenedordocker inspect $container_id
docker-compose exec ubuntu /bin/bash
odocker-compose exec ubuntu /bin/sh
docker-compose down
Aquí hay un pequeño script bash (
my-docker-shell.sh
) para crear el archivo de composición de la ventana acoplable, ejecutar el contenedor, iniciar sesión en el contenedor y, finalmente, limpiar el contenedor de la ventana acoplable y el archivo de composición de la ventana acoplable cuando cierre la sesión.#!/bin/bash cat << 'EOF' > ./docker-compose.yml --- version: "3" services: ubuntu: image: ubuntu:latest command: /bin/bash # tty: true ... EOF printf "Now entering the container...\n" docker-compose run ubuntu bash docker-compose down rm -v ./docker-compose.yml
fuente
En el Dockerfile puede usar el comando:
fuente
Como dijo el comentarista, tendríamos que ver el Dockerfile en cuestión para darle una respuesta completa, pero este es un error muy común. Puedo garantizar bastante que el comando que está intentando ejecutar está iniciando un proceso en segundo plano. Este podría ser el comando que ejecutaría en situaciones que no sean de Docker, pero no es lo correcto en un Dockerfile. Por ejemplo, si lo que está ejecutando normalmente se define como un servicio del sistema, puede usar algo como "systemctl start". Eso iniciaría el proceso en segundo plano, lo que no funcionará. Debe ejecutar el proceso en primer plano, por lo que todo el proceso se bloqueará.
fuente
Solo una nota rapida
He probado una sola imagen basada en
golang
, así que cuando llamodocker-compose down
aquí, obtengo:Mi información de sistema:
fuente
Está bien, encontré mi error. En el Dockerfile de la imagen utilizada para componer, especifiqué que la imagen base debería ser ubuntu: latest, pero previamente creé una imagen llamada ubuntu por mí mismo y esa imagen no funcionó. Así que no utilicé la imagen original de ubuntu, sino una versión corrupta de mi propia imagen, también llamada ubuntu.
fuente