Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Shell into swarm container

I'm unable to connect to a container that's running on a swarm. Seems like the following doesn't work:

docker exec -it <container_ID> bash

Here is some output:

>$ 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

Then I'll run:

$ docker exec -it 2jk3s2xs7ce62piunbkiptypz bash

or

$ docker exec -it login.1 bash

and see the following errors

Error response from daemon: No such container: 2jk3s2xs7ce62piunbkiptypz

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

like image 277
Andi Jay Avatar asked Oct 10 '16 21:10

Andi Jay


2 Answers

Use docker ps to find the names you can use. Look under both CONTAINER ID and NAMES, either will work.

>$ 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:/#

The long name is of the form $SERVICE_NAME.$REPLICA_NUMBER.$ID_FROM_SERVICE_PS

>$ docker exec -it login.1.cg7fltcu3wfe7ixtnqzg8myy1 bash
root@e53bff8bebfc:/#
like image 56
Sam Myers Avatar answered Nov 16 '22 10:11

Sam Myers


Quite an older question, but just my two cents here: I very often run:

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

-q only returns the container id

-f name="login*" applies a filter based on container name, using a regex

This comes in handy because starting a new container will change the container name with some random characters in it. It's important that your filter returns just 1 container, so specify the name in a way that there will be just 1 result. For example: if you have a container "monster" and a container "monitor", you need -f name="moni*" to exclude the "monster" container.

The command will result in something like:

docker exec -it login.1.cg7fltcu3wfe7ixtnqzg8myy1 sh

like image 30
Kenny Avatar answered Nov 16 '22 08:11

Kenny