Оболочка в контейнер swarm

#docker #docker-swarm

#docker #docker-swarm

Вопрос:

Я не могу подключиться к контейнеру, который работает в swarm. Похоже, что следующее не работает:

 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
  

и увидите следующие ошибки

Ответ об ошибке от демона: нет такого контейнера: 2jk3s2xs7ce62piunbkiptypz

Ответ об ошибке от демона: нет такого контейнера: login.1

Комментарии:

1. Опубликуйте сообщение об ошибке, и я полагаю, что это было bash и не bash"

2. Обновлено исходное сообщение. В принципе, docker не видит эти контейнеры

Ответ №1:

Используется docker ps для поиска имен, которые вы можете использовать. Посмотрите под обоими CONTAINER ID и NAMES , либо будет работать.

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

Комментарии:

1. В моем случае длинное имя не сработало, но «идентификатор контейнера» работает.

2. Это, вероятно, очевидно для всех, кроме меня, но все же, если кто-то ошеломлен таким же образом, docker ps он должен быть запущен на рабочем узле swarm, в противном случае на главном docker ps для меня ничего не получается, так как нет запущенных контейнеров.

3. Небольшое дополнение: Если вы видите нужный контейнер docker service ps , но его нет docker ps , проверьте NODE список by docker service ps и войдите в этот хост вместо главного узла, с которого вы начали. Оттуда вы можете использовать docker exec , как описывает @sam-myers.

Ответ №2:

Довольно старый вопрос, но только мои два цента здесь: я очень часто запускаю:

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

-q возвращает только идентификатор контейнера

-f name="login*" применяет фильтр на основе имени контейнера, используя регулярное выражение

Это удобно, потому что запуск нового контейнера приведет к изменению имени контейнера с некоторыми случайными символами в нем. Важно, чтобы ваш фильтр возвращал только 1 контейнер, поэтому укажите имя таким образом, чтобы было только 1 результат. Например: если у вас есть контейнер «monster» и контейнер «monitor», вам необходимо -f name="moni*" исключить контейнер «monster».

Команда приведет к чему-то вроде:

docker exec -it login.1.cg7fltcu3wfe7ixtnqzg8myy1 sh

Комментарии:

1. * Действительно ли это полезно? Я получаю идентификатор контейнера, не используя его.

2. Возможно, двоичные файлы docker делают что-то умное при фильтрации на основе регулярного выражения, я этого не знаю. Это именно то, как я его использую :).