службе docker-compose не удается получить доступ к другой службе через ее имя

#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’, порт);