【问题标题】:How to docker exec -ti CONTAINER_NAME /bin/bash on deployed docker stack?如何在部署的 docker 堆栈上 docker exec -ti CONTAINER_NAME /bin/bash?
【发布时间】:2017-03-22 20:47:37
【问题描述】:

我在 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 命令时,从这些命令派生容器名称的记录方法都不起作用。他们都失败了:

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

我已经尝试过这里列出的东西:

execute a command within docker swarm service

【问题讨论】:

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


【解决方案1】:

其他答案失败了,因为他们没有从任务中提取容器。 Swarm 将一个任务对象包裹在一个容器周围:

taskid=$(docker service ps -q ${servicename} |head -1)
containerid=$(docker inspect -f '{{.Status.ContainerStatus.ContainerID}}' ${taskid})
docker exec -it ${containerid} "$*"

当然,这只会取列表中的第一个容器。

【讨论】:

    【解决方案2】:

    这是我本地 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
    / #
    

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      您可以使用以下命令并将 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
      

      【讨论】:

        猜你喜欢
        • 2018-02-16
        • 1970-01-01
        • 2022-01-21
        • 1970-01-01
        • 2020-05-18
        • 2021-10-24
        • 2017-03-21
        • 2022-12-30
        • 1970-01-01
        相关资源
        最近更新 更多