Условное определение, работает ли Node-сервер внутри Docker-контейнера. - PullRequest
0 голосов
/ 01 июня 2018

У меня есть код node.js, где я устанавливаю соединения mongodb, например: mongodb://localhost:27017/mycollection

Теперь я помещаю свой сервер в один контейнер, а базу данных - в другой контейнер, и я могу подключиться к моей базе данных.с сервера вот так: mongodb://mycontainer:27017/mycollection

У меня настроена эта строка подключения в коде / конфигурации моего сервера.

Теперь, как мне определить, работает ли сервер в контейнере?или нет и, соответственно, взять строку подключения для БД?

Если он запускает ее на хост-компьютере, я хочу использовать первую строку подключения с localhost и подключиться к БД на хост-компьютере, и если онподключается через контейнер, я хочу использовать имя ссылки на контейнер для подключения, как указано во втором случае.

Есть ли способ сделать это?

1 Ответ

0 голосов
/ 01 июня 2018

Лично, когда я хочу сделать это, я устанавливаю переменную ENV в Dockerfile следующим образом:

ENV DATABASE_HOST db

Вы можете иметь полную документацию по справке Dockerfile .

Затем в исходном коде Node.js вам нужно знать, установлен DATABASE_HOST или нет (я могу перенаправить вас на этот пост Переполнения стека. Jayesh: читать переменные среды вNode.js ):

var dbHost = 'localhost';

if (process.env.DATABASE_HOST) {
    dbHost = process.env.DATABASE_HOST;
}

или в одну строку:

var dbHost = process.env.DATABASE_HOST || 'localhost';

Тогда для подключения MongoDB:

var mongodbConnection = 'mongodb://' + dbHost + ':27017/mycollection'

Теперь, когда выЧтобы запустить контейнер, необходимо связать контейнер в команде docker run с --link <your mongodb container>:db (поскольку db - это значение, установленное в переменной ENV).

Но ,Вы также можете использовать опцию -e DATABASE_HOST=<somthing else> (снова с командой docker run) и использовать контейнер MongoDB под другим именем: -e DATABASE_HOST=anotherOne --link mongo:anotherOne.

И снова, вы можете использовать внешнюю MongoDB, не связывая ни один контейнересли вы хотите (которого нет в другом контейнере, возможно): -e DATABASE_HOST=www.mymongo.com.

РЕДАКТИРОВАТЬ: Это решениеn может быть лучше, чем просто определить, запущено ли приложение в контейнере Docker, потому что с этим ваш код может использоваться где угодно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...