Контейнер ссылок Docker — переменные среды не отображаются

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

https://docs.docker.com/userguide/dockerlinks/

Я бегу docker run -d --name mongodb devops-mongodb

Затем я запускаю docker run -d -P --name rest-api --link mongodb devops-rest-api

Чтобы связать мой контейнер mongodb с контейнером rest-api.

Затем документация сказала мне сделать это, чтобы просмотреть переменные среды:

docker run --rm --name rest-api2 --link db:db devops-rest-api env

Однако он не выводит переменные среды, как показано в документах.

Я просто получаю STDOUT из своего приложения Spring Boot.

Что я делаю не так?

Какие переменные среды вы ожидаете? Если вы не установите, не будет отображаться. Было бы полезно, если бы вы разместили свой файл docker здесь. Я думаю, что вы хотите получить доступ к монго из вашего API отдыха, верно? Затем просто укажите mongodb как имя хоста mongo в вашей конфигурации rest-api, и все должно работать. Кстати: во втором вызове у вас есть ошибка, потому что вы указываете не mongodb, а --link db:db. – hrrgttnchml 6 часов назад

EDIT 1: @hrrgttnchml, я ожидаю эти переменные среды прямо из документа:

DB_PORT
DB_PORT_5432_TCP
DB_PORT_5432_TCP_PROTO
DB_PORT_5432_TCP_PORT
DB_PORT_5432_TCP_ADDR

Я не думаю, что вам нужно создавать переменные среды с флагами -e, -env. Согласно документам, Docker создает их автоматически при связывании двух контейнеров:

Docker creates several environment variables when you link containers. Docker automatically creates environment variables in the target container based on the --link parameters. It will also expose all environment variables originating from Docker from the source container. These include variables from:

the ENV commands in the source container’s Dockerfile
the -e, --env and --env-file options on the docker run command when the source container is started

Впрочем, я могу ошибаться.

Вот мой файл docker для rest-api: http://pastebin.com/3Ktbbr9n

Файл докера MongoDB: http://pastebin.com/iqyKm5UK

Оба приложения могут быть запущены при запуске контейнеров. Только не знаю, как их связать.

Да, я хочу, чтобы остальные API взаимодействовали с базой данных mongodb.

Поскольку я запускаю spring-boot для остальных API, я могу указать в своем файле application.properties хост и порт моего сервера mongodb, например:

spring.data.mongodb.host=192.168.99.100
spring.data.mongodb.port=27017

Так ты предлагаешь мне заменить 192.168.99.100 with mongodb?

Я также запускаю виртуальную машину oracle box в Windows, поэтому у самой виртуальной машины есть IP-адрес, и при подключении к контейнеру я должен использовать IP-адрес машины, а НЕ локальный хост, поэтому отсюда и 192.168.99.100. Правильный?

EDIT 2: я получил rest-api для связи с mongodb без привязки контейнера, просто используя адрес виртуальной машины вместе с открытым портом в Dockerfile. Таким образом, для mongodb это будет 192.168.99.100:27017, тогда как для остальных API это будет 192.168.99.100:8080.

Однако это нецелесообразно, поскольку IP-адрес жестко запрограммирован в самом классе rest-api. Таким образом, кто-то другой не сможет запускать изображения в своем контейнере на своем компьютере, потому что IP-адреса не будут совпадать.

Теперь очевидно, что обходной путь заключается в использовании связывания контейнеров в качестве решения, поскольку хост и порт автоматически обновляются в файле /etc/hosts при их изменении, что возвращает нас к исходному вопросу о том, как заставить работать связывание контейнеров.

EDIT 3: Указание mongodb в качестве имени хоста в rest-api действительно работает, но только когда псевдоним для базы данных передается для ссылки, такой как: --link mongodb


person Kingamere    schedule 14.08.2015    source источник
comment
Какие переменные среды вы ожидаете? Если вы не установите, не будет отображаться. Будет полезно, если вы опубликуете здесь свой dockerfile. Я думаю, что вы хотите получить доступ к монго из вашего API отдыха, верно? Затем просто укажите mongodb как имя хоста mongo в вашей конфигурации rest-api, и все должно работать. Кстати: во втором вызове у вас есть ошибка, потому что вы указываете не mongodb, а --link db:db.   -  person daniel.eichten    schedule 15.08.2015
comment
@hrrgttnchml см. редактирование в вопросе   -  person Kingamere    schedule 15.08.2015
comment
Вы пытались проверить свой контейнер rest-api и проверить наличие записей хоста с помощью docker exec rest-api2 host mongodb? Он должен показывать адрес с внутренним IP-адресом докера вашего контейнера монго — обычно 172.x.x.x.   -  person daniel.eichten    schedule 15.08.2015
comment
Ах, да, это сработало, это IP-адрес, который я искал, спасибо.   -  person Kingamere    schedule 15.08.2015


Ответы (1)


Возможно, у devops-rest-api есть ENTRYPOINT? Любые параметры командной строки на вашем docker run будут переданы в точку входа. Вместо указания команды попробуйте переопределить с помощью --entrypoint env.

person Andy Shinn    schedule 14.08.2015
comment
devops-rest-api имеет точку входа: ENTRYPOINT [java,-jar,rest-api.war] - person Kingamere; 15.08.2015
comment
Итак, когда вы передаете env команде запуска, она становится java -jar rest-api.war env. Это, вероятно, не то, что вы ожидали. - person Andy Shinn; 16.08.2015
comment
Если мой ответ помог, подумайте о том, чтобы принять его, чтобы этот вопрос больше не отображался в разделе «Без ответа». - person Andy Shinn; 03.09.2015