我在AWS上使用swarm部署了一个docker堆栈:
docker stack deploy --with-registry-auth -c docker-stack.yml pipeline
我希望在 docker-stack.yml 中定义的容器之一中获得一个交互式bash会话,但我尝试过的各种docker exec -ti CONTAINER_NAME /bin/bash
调用都失败了。
派生要传递给的容器名称的正确方法是什么:
docker exec -it CONTAINER_NAME /bin/bash
鉴于:
docker service ps pipeline_django
返回有效的服务信息,并且:
docker stack ps pipeline
返回有效的堆栈信息。
传递给docker exec -it
命令时,从这些命令派生container_name的任何记录方法都不起作用。他们都失败了:
来自守护程序的错误响应:没有这样的容器
我已尝试过此处列出的内容:
答案 0 :(得分:1)
以下是我本地macOS的示例。
$ 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/tcp
您可以使用容器ID或容器名称来访问容器。
$ 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
/ #
如果目标服务名称足够独特,您可以使用以下单行。
$ 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
/ #
希望这有帮助。
答案 1 :(得分:1)
其他答案失败,因为它们没有从任务中提取容器。 Swarm将任务对象包装在容器周围:
taskid = $(docker服务ps -q $ {servicename} | head -1) containerid = $(docker inspect -f'{{.Status.ContainerStatus.ContainerID}}'$ {taskid}) docker exec -it $ {containerid}“ $ *”
当然,这只会占用列表中的第一个容器。
答案 2 :(得分:0)
您可以使用以下命令并将SERVICE_NAME替换为您的服务名称:
docker exec -it \
$(docker stack ps pipeline| grep SERVICE_NAME | cut -d' ' -f1) /bin/bash
此命令查找服务的容器ID:
docker stack ps pipeline| grep SERVICE_NAME | cut -d' ' -f1