Как избежать ошибки "Docker не может связаться с не запущенным контейнером", когда контейнер с внешними ссылками фактически выполняется с помощью docker-compose

Что мы хотим сделать:

Мы хотим использовать docker-compose, чтобы связать один уже запущенный контейнер (A) с другим контейнером (B) по имени контейнера. Мы используем "external-link", так как оба контейнера запускаются из разных файлов docker-compose.yml.

Проблема:

Контейнер B не запускается с ошибкой, хотя контейнер с таким именем работает.

ERROR: for container_b  Cannot start service container_b: Cannot link to a non running container: /PREVIOUSLY_LINKED_ID_container_a_1 AS /container_b_1/container_a_1

вывод "docker ps":

CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                         NAMES
RUNNING_ID        container_a       "/docker-entrypoint.s"   15 minutes ago      Up 15 minutes       5432/tcp                      container_a_1

Образец кода:

docker-compose.yml контейнера B:

container_b:
  external_links:
  - container_a_1

Чем этот вопрос отличается от других вопросов "как исправить":

  • мы не можем использовать "перезапуск докера службы sudo" (который работает), так как это производственная среда
  • Мы не хотим исправлять это каждый раз вручную, но ищем причину, чтобы мы могли
    • понять, что мы делаем не так
    • понять, как этого избежать

Предположения:

  • Похоже, существует два экземпляра container_a (RUNNING_ID и PREVIOUSLY_LINKED_ID)
  • Это может произойти, потому что мы
    • перестроить контейнер через сборку docker-compose и
    • изменил перенаправленный внешний порт контейнера (80801: 8080)

Комментарий

  • Не использовать docker-compose down как предложено в комментариях, это удаляет темы!

1 ответ

Решение

Ссылки Docker устарели, поэтому, если вам не нужна некоторая функциональность, которую они предоставляют, или они используются в очень старой версии Docker, я бы порекомендовал переключиться на сети Docker.

Поскольку контейнеры, которые вы хотите подключить, по-видимому, запускаются в отдельных файлах компоновки, вы должны создать эту сеть извне:

docker network create app_net

Затем в ваших файлах docker-compose.yml вы подключаете свои контейнеры к этой сети:

version: '3'

networks:
  app_net:
    external:
      name: app_net

services:
  container_a:
    # ...
    networks:
    - app_net

Затем в вашем container_b вы должны подключиться к container_a как "container_a", а не "container_a_1".

Как в сторону, docker-compose down не задокументировано удалить тома, если вы не передадите -v флаг. Возможно, вы используете анонимные тома, и в этом случае я не уверен, что docker-compose up будет знать, где найти ваши данные. Именованный том является предпочтительным. Скорее всего, ваши данные не хранились в томе, что опасно и лишает вас возможности обновлять ваши контейнеры:

$ docker-compose down --help

By default, the only things removed are:

- Containers for services defined in the Compose file
- Networks defined in the `networks` section of the Compose file
- The default network, if one is used

Networks and volumes defined as `external` are never removed.

Usage: down [options]

Options:
    --rmi type          Remove images. Type must be one of:
                        'all': Remove all images used by any service.
                        'local': Remove only images that don't have a custom tag
                        set by the `image` field.
    -v, --volumes       Remove named volumes declared in the `volumes` section
                        of the Compose file and anonymous volumes
                        attached to containers.
    --remove-orphans    Remove containers for services not defined in the
                        Compose file
Другие вопросы по тегам