docker-compose wait-for.sh не работает для ожидания mongodb - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь настроить сеть докеров с простыми сервисами nodejs и mongodb, следуя этому руководству , однако при сборке nodejs происходит сбой, поскольку он не может подключиться к mongodb.

docker-compose.yml

version: "3"
services:
  nodejs:
    container_name: nodejs # How the container will appear when listing containers from the CLI
    image: node:10 # The <container-name>:<tag-version> of the container, in this case the tag version aligns with the version of node
    user: node # The user to run as in the container
    working_dir: "/app" # Where to container will assume it should run commands and where you will start out if you go inside the container
    networks:
      - app # Networking can get complex, but for all intents and purposes just know that containers on the same network can speak to each other
    ports:
      - "3000:3000" # <host-port>:<container-port> to listen to, so anything running on port 3000 of the container will map to port 3000 on our localhost
    volumes:
      - ./:/app # <host-directory>:<container-directory> this says map the current directory from your system to the /app directory in the docker container
    command: # The command docker will execute when starting the container, this command is not allowed to exit, if it does your container will stop
      - ./wait-for.sh
      - --timeout=15
      - mongodb:27017
      - --
      - bash
      - -c
      - npm install && npm start
    env_file: ".env"
    environment: 
      - MONGO_USERNAME=$MONGO_USERNAME
      - MONGO_PASSWORD=$MONGO_PASSWORD
      - MONGO_HOSTNAME=mongodb
      - MONGO_PORT=$MONGO_PORT
      - MONGO_DB=$MONGO_DB
    depends_on:
      - mongodb

  mongodb:
    image: mongo:4.1.8-xenial
    container_name: mongodb
    restart: unless-stopped
    env_file: .env
    environment:
      - MONGO_INITDB_ROOT_USERNAME=$MONGO_USERNAME
      - MONGO_INITDB_ROOT_PASSWORD=$MONGO_PASSWORD
    volumes:  
      - dbdata:/data/db 
    networks:
      - app

networks:
  app:
   driver: bridge

volumes:
  dbdata:

app.js

const express = require('express');
var server = express();
var bodyParser = require('body-parser');

// getting-started.js
var mongoose = require('mongoose');
mongoose.connect('mongodb://simpleUser:123456@mongodb:27017/simpleDb', {useNewUrlParser: true});

server.listen(3000, function() {
  console.log('Example app listening on port 3000');
});

Вот обычный wait-for.sh скрипт, которыйЯ использовал.https://github.com/eficode/wait-for/blob/master/wait-for

docker logs -f nodejs дает;

Operation timed out

Спасибо за помощь!

Ответы [ 2 ]

2 голосов
/ 13 июня 2019

В этом случае я считаю, что проблема в том, что вы используете сценарий wait-for.sh, который использует команду netcat (см. https://github.com/eficode/wait-for/blob/master/wait-for#L24),, но для узла: в образе 10 не установлен netcat. ..

Я бы предложил создать пользовательское изображение на основе узла: 10 image и добавить netcat или использовать другой подход (предпочтительно решение на основе nodejs) для проверки доступности mongodb

Пример Dockerfile для создания собственного изображения выглядит примерно так

FROM node:10

RUN apt update && apt install -y netcat

Затем вы можете создать этот образ, заменив image: node:10 на

build: 
  dockerfile: Dockerfile
  context: .

и с тобой все будет в порядке

0 голосов
/ 13 июня 2019

Я обнаружил проблему из-за того, что в образе node:10 не установлена ​​команда nc, поэтому она не работала. Я переключился на изображение node:10-alpine, и оно заработало.

...