Shell 进入 swarm 容器

Shell into swarm container

我无法连接到 运行集群上的容器。似乎以下内容不起作用:

docker exec -it <container_ID> bash

这是一些输出:

>$ docker service ls
ID            NAME          REPLICAS  IMAGE                              COMMAND
4rliefwe74o5  login         1/1       login-arm64:1.0


>$ docker service ps login
ID                         NAME     IMAGE                       NODE               DESIRED STATE  CURRENT STATE          ERROR
2jk3s2xs7ce62piunbkiptypz  login.1  login-arm64:1.0  odroid64-cluster4  Running        Running 5 minutes ago

那我运行:

$ docker exec -it 2jk3s2xs7ce62piunbkiptypz bash

$ docker exec -it login.1 bash

并看到以下错误

Error response from daemon: No such container: 2jk3s2xs7ce62piunbkiptypz

Error response from daemon: No such container: login.1

使用 docker ps 查找您可以使用的名称。查看 CONTAINER IDNAMES 两者都行。

>$ docker ps
CONTAINER ID        IMAGE             COMMAND                  CREATED             STATUS              PORTS               NAMES
e53bff8bebfc        login-arm64:1.0   "/bin/sh -c 'node ser"   27 seconds ago      Up 25 seconds                           login.1.cg7fltcu3wfe7ixtnqzg8myy1

>$ docker exec -it e53bff8bebfc bash
root@e53bff8bebfc:/#

长名称的格式为 $SERVICE_NAME.$REPLICA_NUMBER.$ID_FROM_SERVICE_PS

>$ docker exec -it login.1.cg7fltcu3wfe7ixtnqzg8myy1 bash
root@e53bff8bebfc:/#

相当老的问题,但这里只是我的两分钱:我经常 运行:

docker exec -it $(docker ps -q -f name="login*") sh

-q 仅 returns 容器 id

-f name="login*" 根据容器名称应用过滤器,使用正则表达式

这会派上用场,因为启动一个新容器会更改容器名称,其中包含一些随机字符。重要的是您的过滤器 returns 只有 1 个容器,因此请以只有 1 个结果的方式指定名称。例如:如果你有一个容器"monster"和一个容器"monitor",你需要-f name="moni*"来排除"monster"容器。

该命令将产生如下结果:

docker exec -it login.1.cg7fltcu3wfe7ixtnqzg8myy1 sh