Я пытаюсь настроить сеть докеров с простыми службами 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
Спасибо за вашу помощь!
Да, ты был прав @AlexBlex. Проблема заключалась в том, что на изображении, которое я использовал, не установлена команда nc
.
Я обнаружил проблему, которая была связана с тем, что на изображении 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 и альпийской версией.
Alpine — очень урезанная версия Linux. Он очень легкий, и я использую его сам, если нет особых причин не делать этого. Однако стоит отметить, что alpine использует musl вместо glibc (который используется во многих других ОС на базе Linux), поэтому могут быть небольшие различия в некоторых основных функциях (например, форматирование даты и т. д.). хороший вариант для создания легковесного образа для вашего приложения
Ах я вижу. имеет смысл. Еще раз спасибо Карлис!
Драйвер nodejs сам ожидает mongodb. По умолчанию connectTimeoutMS составляет 30 секунд — в два раза больше, чем вы установили в параметрах ожидания. Проблема в другом. Проверьте журналы монго, попробуйте войти вручную из контейнера nodejs и т. д.