如何在已部署的docker堆栈上停靠exec -ti CONTAINER_NAME / bin / bash?

时间:2017-03-22 20:47:38

标签: docker docker-compose amazon-cloudformation docker-swarm

我在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的任何记录方法都不起作用。他们都失败了:

  

来自守护程序的错误响应:没有这样的容器

我已尝试过此处列出的内容:

execute a command within docker swarm service

3 个答案:

答案 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