Как я могу раскрутить несколько узлов js сервисов внутри одного docker compose? - PullRequest
0 голосов
/ 20 октября 2019

Итак, я хочу, чтобы были запущены 2 док-контейнера (MongoDB и Postgres), оба они работают. Теперь я хочу создать 2 службы (экземпляры node.js), которые будут подключаться из отдельных контейнеров, которые будут запрашивать и использовать их базу данных. Каждый сервис должен иметь доступ только к одной базе данных.

Показать мой docker-compose.yml

services:

  #mongodb set up
  web:
    image: node
    build: ./mongodb_service
    ports:
    - 4000:4000
    depends_on:
    - mongodb

  mongodb:
    image: mongo
    expose:
    - '27017'

  web_postgres:
    image: node
    build: ./postgres_service
    ports:
      - "3000:3000"
    depends_on:
    - postgresdb

  #postgres db definition the env vars should be put in a properties file and passed to it somehow
  postgresdb:
    image: postgres
    #the health check confirms that the db is ready to accept connections and not just the container
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5
    environment:
      - PGUSER=user
      - PGPASSWORD=1234
      - PGPORT=5432
      - PGDATABASE=customerdirectory
#   Maps port 54320 (localhost) to port 5432 on the container. You can change the ports to fix your needs.
    ports:
      - "54320:5432"

В настоящее время ломается моя служба web_postgres. Когда я запускаю docker-compose up, я замечаю, что команды console.log () из моей службы web заканчиваются на web_postgres Вот что я имею в виду web_postgres error . В верхней части изображения моя служба web_postgres_1 печатает материалы из службы web.

Правильно ли настроен мой docker-compose.yml, чтобы эти контейнеры работали независимо?

Если естьчто-то вроде недостающей части, пожалуйста, lmk загрузит. Большое спасибо за вашу помощь.

Это файл server.js из моей службы web_postgres.

const express = require("express");
const { Pool, Client } = require('pg')
const app = express()
// pools will use environment variables
// for connection information
const pool = new Pool({
  user: 'user',
  host: 'localhost',
  database: 'customerdirectory',
  password: '1234',
  port: 5432,
})

pool.query('SELECT NOW()', (err, res) => {
  console.log(err, res)
  pool.end()
})

app.get("/", (req, res) => {
  res.send("Hello from Node.js app \n");
});

app.listen('3000', () =>{
  console.log("I hate this damn thingy sometimes")
})

Это код службы web server.js, который печатается

const express = require("express");
var MongoClient = require('mongodb').MongoClient;
const app = express();

MongoClient.connect("mongodb://mongodb:27017", function(err, db) {
  if(err) throw err;
  db.close()
})

app.get("/", (req, res) => {
  res.send("Hello from Node.js app \n");
});

app.listen('4000', () =>{
  console.log("I hate this damn thingy sometimes")
})

1 Ответ

0 голосов
/ 20 октября 2019

Вам необходимо удалить image: из вашего docker-compose.yml файла. Когда вы указываете, что оба контейнера имеют одинаковый image:, Docker Compose принимает вас по номиналу и использует одно и то же изображение для обоих, даже если есть отдельные инструкции build:.

Документация для image: примечания:

Если изображение не существует, Compose попытается вытащить его, если вы не указали также build , и в этом случае оно создается с использованиемуказанные параметры и помечает его указанным тегом.

Таким образом, здесь происходит то, что Compose создает образ первого сервиса и помечает его как node:latest (потенциально конфликтующий со стандартным образом Docker Hub сэто же имя);и когда запускается второй контейнер, он видит, что изображение уже существует, и использует его повторно.

Это можно продемонстрировать с помощью простой настройки. Создайте новый пустой каталог с подкаталогами a и b. Создайте a/Dockerfile:

FROM busybox
WORKDIR /app
RUN echo Hello from a > hello.txt
EXPOSE 80
CMD ["httpd", "-f"]

Аналогичным образом создайте b/Dockerfile с другой строкой.

Теперь создайте этот docker-compose.yml файл:

version: '3'
services:
  a:
    # image: image
    build: a
    ports: ['8000:80']
  b:
    # image: image
    build: b
    ports: ['8001:80']

Вы можете начатьэто как есть, curl http://localhost:8000/hello.txt и аналогично для порта 8001, чтобы увидеть два разных ответа. Но если вы раскомментируете две строки image:, они обе вернут одну и ту же строку. Есть также некоторые подсказки в выводе Docker Compose, где один путь создает оба изображения, а другой - только один, и при указании имен изображений появляется предупреждение о том, что именованный образ не существует.

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