Docker-compose wait-for.sh не работает из-за ожидания mongodb

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

докер-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.info('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

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

Драйвер nodejs сам ожидает mongodb. По умолчанию connectTimeoutMS составляет 30 секунд — в два раза больше, чем вы установили в параметрах ожидания. Проблема в другом. Проверьте журналы монго, попробуйте войти вручную из контейнера nodejs и т. д.

Alex Blex 13.06.2019 14:14

Да, ты был прав @AlexBlex. Проблема заключалась в том, что на изображении, которое я использовал, не установлена ​​команда nc.

quartaela 13.06.2019 15:00
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
2 625
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Ответ принят как подходящий

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

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

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

FROM node:10

RUN apt update && apt install -y netcat

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

build: 
  dockerfile: Dockerfile
  context: .

и ты должен быть в порядке

Ты прав Карлис. Я переключился на другое изображение node:10-alpine. Не знаю, есть ли большая разница между node:10 и альпийской версией.

quartaela 13.06.2019 15:08

Alpine — очень урезанная версия Linux. Он очень легкий, и я использую его сам, если нет особых причин не делать этого. Однако стоит отметить, что alpine использует musl вместо glibc (который используется во многих других ОС на базе Linux), поэтому могут быть небольшие различия в некоторых основных функциях (например, форматирование даты и т. д.). хороший вариант для создания легковесного образа для вашего приложения

Kārlis Ābele 13.06.2019 15:15

Ах я вижу. имеет смысл. Еще раз спасибо Карлис!

quartaela 13.06.2019 15:16

Другие вопросы по теме