Как избежать ошибки "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 и
- изменил перенаправленный внешний порт контейнера (808
01: 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