#docker #shell #networking #docker-compose
#docker #оболочка #сеть #docker-compose
Вопрос:
У меня есть 2 контейнера, работающих с docker compose. Один из контейнеров выполняет сценарий оболочки, который должен проверить, запущен ли другой контейнер и работает ли он на порту 9990.
Несмотря на то, что контейнер запускается, сценарий оболочки ничего не выдает.
keycloak:
image: jboss/keycloak:latest
volumes:
- ./imports/cache_reload/disable-theme-cache.cli:/opt/jboss/startup-scripts/disable-theme-cache.cli
- ./imports/themes/custom/:/opt/jboss/keycloak/themes/custom-theme/
- ./imports/realm/realm-export.json:/opt/jboss/realms/custom-import.json
environment:
DB_VENDOR: MYSQL
DB_ADDR: mysql
DB_DATABASE: keycloak
DB_USER: keycloak
DB_PASSWORD: password
KEYCLOAK_USER: admin
KEYCLOAK_PASSWORD: Pa55w0rd
ports:
- 8080:8080
depends_on:
- mysql
keycloak_installer:
image: solr:6.6-alpine
volumes:
- ./imports/scripts/import-realm.sh:/docker-entrypoint-initdb.d/init.sh
depends_on:
- keycloak
Сценарий оболочки выглядит следующим образом:
echo "MOIN LEUDE TRYMACS HIER!"
while ! nc -z localhost 9990; do
sleep 1
echo "Waiting for keycloak server startup 9990..."
echo "$(nc -z localhost 9990)"
done
Печатается первое echo, но затем больше ничего не печатается.
На порту 9990 выполняется перехват ключей контейнера.
Пожалуйста, помогите, спасибо
Комментарии:
1. С точки зрения контейнера «установщик»
localhost
, это контейнер «установщик». Имена хостов, доступных для подключения к другим контейнерам, см. в разделе Создание сети в Compose ; вы должны иметь возможность использовать имя службы Composekeycloak
в качестве имени хоста.2. Я пробовал while ! nc -z keycloak 9990; это все то же самое. есть идеи? большое спасибо!
Ответ №1:
Вы должны более подробно изучить сеть в docker compose.
Чтобы решить вашу проблему, вам нужно :
- Добавьте сеть в свой файл docker compose для каждого контейнера (существует сеть по умолчанию, но для понимания механизма вы можете определить ее явно). Это должно выглядеть следующим образом (например, в разделе «Порты») для первого контейнера (с именем keycloak):
ports:
- 8080:8080
networks:
- keycloak_network
Во втором контейнере (с именем keycloak_installer) (вы должны предоставить порт, который хотите запросить в первом контейнере):
depends_on:
- keycloak
networks:
- keycloak_network
- В вашем скрипте явно вызывается второй контейнер, который теперь будет доступен по сети. Вы должны изменить свой код следующим образом :
nc -z keycloak_installer 9990
Комментарии:
1. Вам не нужно выполнять ни одну из частей шага 1. Compose создает
default
сеть и присоединяет к ней контейнеры, если вы ничего не делаете; «разоблачить» как глагол почти ничего не значит в современном Docker; соединения между контейнерами полностью игнорируютсяports:
.2. Спасибо за ваш отзыв. Я отредактировал свой ответ, я думаю, четко определите сеть, которую легче понять. Что касается порта, вы правы, это на всякий случай, но в этом нет необходимости, я его удалил.