#docker #docker-compose #dockerfile
#docker #docker-compose #dockerfile
Вопрос:
Я довольно новичок в docker, но после просмотра нескольких руководств я понял, что если я хочу, чтобы мои службы имели общий код, я должен использовать docker-compose.
Это моя структура каталогов:
- project
- docker-compose.yml
- packages
- common
- src
- eureka
- eureka-helper.js
- gateway
- Dockerfile
- src
- (some more directories and files)
- server.js
- users
- Dockerfile
- src
- app.js
- (some more directories and files)
version: '3'
services:
eureka:
image: springcloud/eureka
ports:
- "8761:8761"
gateway:
build:
context: ./
dockerfile: ./packages/gateway/Dockerfile
ports:
- "3000:3000"
links:
- eureka
users:
build:
context: ./
dockerfile: ./users/Dockerfile
ports:
- "3004:3004"
links:
- mongo
- eureka
mongo:
image: mongo
volumes:
- C:UsersmyUserdockermongodb-data:/data/db
ports:
- "27017:27017"
Мой server.js (внутри шлюза) и app.js (внутри пользователей) вызовите функцию внутри eureka-helper, которая регистрируется в Eureka.
eurekaHelper.registerWithEureka('gateway', eureka, port);
Но кажется, что server.js не имеет значения для этого eureka:
gateway_1 | /opt/app/gateway/server.js:27
gateway_1 | eurekaHelper.registerWithEureka('gateway', eureka, port);
gateway_1 | ^
gateway_1 |
gateway_1 | ReferenceError: eureka is not defined
Согласно этому: https://docs.docker.com/compose/networking /, не похоже, что мне действительно нужна ссылка в docker-compose:
Ссылки позволяют определить дополнительные псевдонимы, с помощью которых служба доступна из другой службы. Они не требуются для обеспечения взаимодействия служб — по умолчанию любая служба может связаться с любой другой службой по имени этой службы.
… но gateway в любом случае не может связаться с eureka.
Есть идеи, если я что-то упускаю.
Когда я выполняю проверку в gateway:
"Networks": {
"*project*_default": {
"IPAMConfig": null,
"Links": null,
"Aliases": [
"gateway",
"a358b371de9d"
],
"NetworkID": "d986ee77bf6181e9dd59711650359dc49fd8ce3fc34c6772133a0049ab55bd3b",
"EndpointID": "9633a7affe435793345342d4f6d00d5bef43d2267676448dfde0f97d75d5f7af",
"Gateway": "172.19.0.1",
"IPAddress": "172.19.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:13:00:03",
"DriverOpts": null
}
}
Когда я выполняю проверку в eureka:
"Networks": {
"*project*_default": {
"IPAMConfig": null,
"Links": null,
"Aliases": [
"eureka",
"17a218bf6e9e"
],
"NetworkID": "d986ee77bf6181e9dd59711650359dc49fd8ce3fc34c6772133a0049ab55bd3b",
"EndpointID": "43f4a9eb9efd4d30ad65d2c943065b8fb32ed50822bd553e07a2b0020c173fec",
"Gateway": "172.19.0.1",
"IPAddress": "172.19.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:13:00:02",
"DriverOpts": null
}
}
Комментарии:
1. попробуйте передать их как переменную окружения и используйте эту переменную окружения в коде.
2. Я раньше не использовал ссылки… Возможно, попробуйте вместо этого поместить их в сети. Контейнеры в одной сети могут связываться друг с другом по имени службы. По умолчанию все службы находятся внутри
default
сети, поэтому все контейнеры достигают друг друга.3. Это не похоже на проблему с docker или docker compose, а скорее на программную ошибку в вашем коде. Я полагаю,
ReferenceError: eureka is not defined
это говорит вам о том, что вы не определили переменнуюeureka
.4. Я добавил кавычки вокруг eureka при вызове функции, и теперь это работает: eurekaHelper.registerWithEureka(‘users’, ‘eureka’, порт);