Проблема с подключением контейнеров с использованием docker -compose.yml - PullRequest
0 голосов
/ 23 апреля 2020

Я получил три контейнера, описанных в docker-compose.yml - postgres как база данных, redis для кэша и основное приложение node:

version: '3.6'

services:
  db:
    user: '${UID}:${GID}'
    image: postgres:latest
    env_file: .env
    container_name: ${POSTGRES_CONTAINER}
    ports:
      - '${POSTGRES_PORT}:5432'
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DATABASE: ${POSTGRES_DB}
      PGDATA: /var/lib/postgresql/data/${POSTGRES_DB}
    volumes:
      - ./data:/var/lib/postgresql/data/${POSTGRES_DB}
      - ./init-testdb.sh:/docker-entrypoint-initdb.d/init-testdb.sh:ro

  cache:
    image: redis:latest
    env_file: .env
    container_name: ${REDIS_CONTAINER}
    sysctls:
      net.core.somaxconn: '511'
    ports:
      - '${REDIS_PORT}:6379'
    command: ['--requirepass "secret"']

  api:
    image: node:latest
    env_file: .env
    container_name: ${SERVER_CONTAINER}
    working_dir: /var/www/app
    command: ['npm', 'start']
    ports:
      - '${SERVER_PORT}:5000'
    volumes:
      - ./node_modules:/var/www/app/node_modules
      - .:/var/www/app
    depends_on:
      - db
      - cache

volumes:
  node_modules:

Они запускаются через npm скрипт в package.json:

  "scripts": {
    "dev": "docker-compose up",
    "start": "nodemon src/server.js"
  }

Приложение node не видит два других контейнера. Например, подключение к postgres всегда прерывается, даже если контейнер db запущен нормально. Если я закомментирую приложение node из docker-compose.yml и запустлю только дб и кеш, то запусту основное приложение с простым npm start - все работает как надо.

У меня все хорошо с запуском все это так, docker-compose.yml только для удобства разработки. Но я хотел бы знать, почему node не может подключиться к postgres контейнеру, когда я пытаюсь запустить все три из них через docker-compose.yml.

Вероятно, это что-то до боли очевидно, но я могу ' Кажется, это понять. Предложения и помощь приветствуются!

Ниже приведен файл .env, из которого docker извлекает переменные:

POSTGRES_CONTAINER=boilerplate-db
REDIS_CONTAINER=boilerplate-cache
SERVER_CONTAINER=boilerplate-api

NODE_ENV=development

SERVER_PORT=5000
SERVER_HOSTNAME=localhost
SERVER_PROTOCOL=http

POSTGRES_USER=root
POSTGRES_PASSWORD=secret
POSTGRES_HOST=localhost
POSTGRES_PORT=5432
POSTGRES_DB=boilerplate
POSTGRES_TEST_USER=test
POSTGRES_TEST_PASSWORD=test
POSTGRES_TEST_DB=boilerplate_test

REDIS_PORT=6379
REDIS_HOST=localhost
REDIS_PASSWORD=secret
...