Tengo una pila acoplable implementada en AWS con enjambre:
docker stack deploy --with-registry-auth -c docker-stack.yml pipeline Quiero obtener una sesión de bash interactiva en uno de los contenedores definidos en docker-stack.yml , pero las diversas invocaciones de docker exec -ti CONTAINER_NAME /bin/bash que probé fallan.
¿Cuál es el método correcto para derivar un nombre de contenedor para pasarlo a:
docker exec -it CONTAINER_NAME /bin/bashdado que:
docker service ps pipeline_djangodevuelve información de servicio válida y:
docker stack ps pipelinedevuelve información válida de la pila.
Ninguno de los métodos documentados para derivar container_name de estos comandos funciona cuando se pasa al comando docker exec -it . Todos fallan con:
Respuesta de error del demonio: No existe tal contenedor
He probado las cosas enumeradas aquí:
Las otras respuestas fallaron, porque no extraen el contenedor de la tarea. Swarm envuelve un objeto de tarea alrededor de un contenedor:
taskid=$(docker service ps -q ${servicename} |head -1) containerid=$(docker inspect -f '{{.Status.ContainerStatus.ContainerID}}' ${taskid}) docker exec -it ${containerid} "$*"Por supuesto, esto solo tomará el primer contenedor de la lista.
Aquí hay un ejemplo en mi macOS local.
$ docker stack ls NAME SERVICES gospot_web 1 $ docker service ls ID NAME MODE REPLICAS IMAGE PORTS qigx492p2lbe gospot_web_web global 1/1 gospot/gospot-web:0.1.20.g225306b *:80->80/tcp, *:443->443/tcpPuede usar la identificación del contenedor o el nombre del contenedor para acceder al contenedor.
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b3824a85d3c8 gospot/gospot-web:0.1.20.g225306b "nginx -g 'daemon of…" 2 hours ago Up 2 hours (healthy) 80/tcp, 443/tcp gospot_web_web.3cqcd1v22vaon517j7p5h1d9a.wrel676fcllssrm3151ymkse9 $ docker exec -it b3824a85d3c8 sh / # ls bin etc lib mnt root sbin sys usr dev home media proc run srv tmp var / # $ docker exec -it gospot_web_web.3cqcd1v22vaon517j7p5h1d9a.wrel676fcllssrm3151ymkse9 sh / # ls bin dev etc home lib media mnt proc root run sbin srv sys tmp usr var / #Si el nombre del servicio de destino es lo suficientemente único, puede usar la siguiente línea.
$ docker exec -it $(docker ps | grep gospot_web_web | awk '{print $1}') sh / # ls bin etc lib mnt root sbin sys usr dev home media proc run srv tmp var / #Espero que esto ayude.
Puede usar el siguiente comando y reemplazar SERVICE_NAME con el nombre de su servicio:
docker exec -it \ $(docker stack ps pipeline| grep SERVICE_NAME | cut -d' ' -f1) /bin/basheste comando encuentra la identificación del contenedor de su servicio:
docker stack ps pipeline| grep SERVICE_NAME | cut -d' ' -f1