Can't authenticate with mongoDB from docker-compose service - node.js
What I'm trying to do
I'm trying to set up a docker-compose definition, where I have a mongoDB container, and a nodeJS container that connects to it.
version: "3.9"
services:
events-db:
image: mongo
volumes:
- db-volume:/data/db
environment:
MONGO_INITDB_ROOT_USERNAME: $SANDBOX_DB_USER
MONGO_INITDB_ROOT_PASSWORD: $SANDBOX_DB_PASS
MONGO_INITDB_DATABASE: sandboxdb
app:
image: node:15.12.0
user: node
working_dir: /home/node/app
volumes:
- ./:/home/node/app:ro
environment:
MDB_CONNECTION: mongodb://$SANDBOX_DB_USER:$SANDBOX_DB_PASS#events-db:27017/sandboxdb
command: node myapp
depends_on:
- events-db
volumes:
db-volume:
Along with a .env file that declares the credentials (planning to use proper env variables when I deploy this to a production environment):
SANDBOX_DB_USER=myuser
SANDBOX_DB_PASS=myp4ss
Finally, my nodejs script, myapp.js is simply trying to connect, grab a reference to a collection, and insert a document:
require('dotenv').config()
const { MongoClient } = require('mongodb')
async function main () {
console.log('Connecting')
const client = new MongoClient(process.env.MDB_CONNECTION, {
connectTimeoutMS: 10000,
useUnifiedTopology: true,
})
await client.connect()
const db = client.db()
const events = db.collection('events')
console.log('Inserting an event')
await events.insertOne({
type: 'foo',
timestamp: new Date(),
})
console.log('Done.')
process.exit(0)
}
if (require.main === module) {
main()
}
Result
When I run docker-compose config I see the following output, so I would expect it to work:
$ docker-compose config
services:
app:
command: node myapp
depends_on:
events-db:
condition: service_started
environment:
MDB_CONNECTION: mongodb://myuser:myp4ss#events-db:27017/sandboxdb
image: node:15.12.0
user: node
volumes:
- C:\workspace\dcsandbox:/home/node/app:ro
working_dir: /home/node/app
events-db:
environment:
MONGO_INITDB_DATABASE: sandboxdb
MONGO_INITDB_ROOT_PASSWORD: myp4ss
MONGO_INITDB_ROOT_USERNAME: myuser
image: mongo
volumes:
- db-volume:/data/db:rw
version: '3.9'
volumes:
db-volume: {}
However, when I run docker-compose up I see that my node container is unable to connect to the mongoDB to insert an event:
events-db_1 | {"t":{"$date":"2021-04-07T13:57:36.793+00:00"},"s":"I", "c":"NETWORK", "id":23016, "ctx":"listener","msg":"Waiting for connections","attr":{"port":27017,"ssl":"off"}}
app_1 | Connecting
events-db_1 | {"t":{"$date":"2021-04-07T13:57:38.811+00:00"},"s":"I", "c":"NETWORK", "id":22943, "ctx":"listener","msg":"Connection accepted","attr":{"remote":"172.27.0.3:34164","connectionId":1,"connectionCount":1}}
events-db_1 | {"t":{"$date":"2021-04-07T13:57:38.816+00:00"},"s":"I", "c":"NETWORK", "id":51800, "ctx":"conn1","msg":"client metadata","attr":{"remote":"172.27.0.3:34164","client":"conn1","doc":{"driver":{"name":"nodejs","version":"3.6.6"},"os":{"type":"Linux","name":"linux","architecture":"x64","version":"4.19.128-microsoft-standard"},"platform":"'Node.js v15.12.0, LE (unified)"}}}
events-db_1 | {"t":{"$date":"2021-04-07T13:57:38.820+00:00"},"s":"I", "c":"NETWORK", "id":22943, "ctx":"listener","msg":"Connection accepted","attr":{"remote":"172.27.0.3:34166","connectionId":2,"connectionCount":2}}
events-db_1 | {"t":{"$date":"2021-04-07T13:57:38.822+00:00"},"s":"I", "c":"NETWORK", "id":51800, "ctx":"conn2","msg":"client metadata","attr":{"remote":"172.27.0.3:34166","client":"conn2","doc":{"driver":{"name":"nodejs","version":"3.6.6"},"os":{"type":"Linux","name":"linux","architecture":"x64","version":"4.19.128-microsoft-standard"},"platform":"'Node.js v15.12.0, LE (unified)"}}}
events-db_1 | {"t":{"$date":"2021-04-07T13:57:38.822+00:00"},"s":"I", "c":"ACCESS", "id":20251, "ctx":"conn2","msg":"Supported SASL mechanisms requested for unknown user","attr":{"user":"myuser#sandboxdb"}}
events-db_1 | {"t":{"$date":"2021-04-07T13:57:38.823+00:00"},"s":"I", "c":"ACCESS", "id":20249, "ctx":"conn2","msg":"Authentication failed","attr":{"mechanism":"SCRAM-SHA-256","principalName":"myuser","authenticationDatabase":"sandboxdb","client":"172.27.0.3:34166","result":"UserNotFound: Could not find user \"myuser\" for db \"sandboxdb\""}}
events-db_1 | {"t":{"$date":"2021-04-07T13:57:38.824+00:00"},"s":"I", "c":"ACCESS", "id":20249, "ctx":"conn2","msg":"Authentication failed","attr":{"mechanism":"SCRAM-SHA-1","principalName":"myuser","authenticationDatabase":"sandboxdb","client":"172.27.0.3:34166","result":"UserNotFound: Could not find user \"myuser\" for db \"sandboxdb\""}}
events-db_1 | {"t":{"$date":"2021-04-07T13:57:38.826+00:00"},"s":"I", "c":"NETWORK", "id":22944, "ctx":"conn1","msg":"Connection ended","attr":{"remote":"172.27.0.3:34164","connectionId":1,"connectionCount":1}}
app_1 | /home/node/app/node_modules/mongodb/lib/cmap/connection.js:268
app_1 | callback(new MongoError(document));
app_1 | ^
app_1 |
app_1 | MongoError: Authentication failed.
app_1 | at MessageStream.messageHandler (/home/node/app/node_modules/mongodb/lib/cmap/connection.js:268:20)
app_1 | at MessageStream.emit (node:events:369:20)
app_1 | at processIncomingData (/home/node/app/node_modules/mongodb/lib/cmap/message_stream.js:144:12)
app_1 | at MessageStream._write (/home/node/app/node_modules/mongodb/lib/cmap/message_stream.js:42:5)
app_1 | at writeOrBuffer (node:internal/streams/writable:395:12)
app_1 | at MessageStream.Writable.write (node:internal/streams/writable:340:10)
app_1 | at Socket.ondata (node:internal/streams/readable:750:22)
app_1 | at Socket.emit (node:events:369:20)
app_1 | at addChunk (node:internal/streams/readable:313:12)
app_1 | at readableAddChunk (node:internal/streams/readable:288:9) {
app_1 | ok: 0,
app_1 | code: 18,
app_1 | codeName: 'AuthenticationFailed'
app_1 | }
events-db_1 | {"t":{"$date":"2021-04-07T13:57:38.832+00:00"},"s":"I", "c":"NETWORK", "id":22944, "ctx":"conn2","msg":"Connection ended","attr":{"remote":"172.27.0.3:34166","connectionId":2,"connectionCount":0}}
dcsandbox_app_1 exited with code 1
I've put the full output at https://pastebin.com/uNyJ6tiy
and the example code at this repo: https://github.com/akatechis/example-docker-compose-mongo-node-auth
After some more digging, I managed to figure it out. The issue is that the MONGO_INITDB_ROOT_USERNAME and MONGO_INITDB_ROOT_PASSWORD variables simply set the root user's credentials, and the MONGO_INITDB_DATABASE simply sets the initial database for scripts in /docker-entrypoint-initdb.d.
By default, the root user is added to the admin database, so by removing the /sandboxdb part of the connection string, I was able to have my node app authenticate against the admin DB as the root user.
While this doesn't quite accomplish what I wanted initially (to create a separate, non-root user for my database, and use that to authenticate), I think this puts me on the right path to using an init script to set up the user accounts I want to have.
Related
Unable to connect nodejs app to mongodb using docker-compose
Simple Node app and mongo containers created using docker-compose below... What am I missing? mongodb://user:password#mongo:27017/ version: '3.8' services: mongo: image: mongo restart: always environment: - MONGO_INITDB_ROOT_USERNAME=user - MONGO_INITDB_ROOT_PASSWORD=password app: image: app build: context: ./app dockerfile: Dockerfile ports: - "3000:3000" depends_on: - mongo I've read several posts on the same issue and the official mongo docker page and seem to be doing everything correct. Keep getting the following msg. app_1 | mongodb://user:password#mongo:27017/ { app_1 | autoIndex: false, app_1 | poolSize: 10, app_1 | bufferMaxEntries: 0, app_1 | useNewUrlParser: true, app_1 | useUnifiedTopology: true app_1 | } app_1 | MongoDB connection with retry app_1 | MongoDB connection unsuccessful, retry after 5 seconds. 2
I prepared interesting test for you version: '3.8' services: mongo: image: mongo environment: - MONGO_INITDB_ROOT_USERNAME=user - MONGO_INITDB_ROOT_PASSWORD=password healthcheck: test: "echo 'db.runCommand(\"ping\").ok'" interval: 5s timeout: 5s retries: 3 app: image: mongo command: "mongosh mongodb://user:password#mongo:27017/admin --eval \"printjson(db.test.insertOne({'a': 1}))\"" ports: - "3000:3000" depends_on: - mongo It will print app_1 | { app_1 | acknowledged: true, app_1 | insertedId: ObjectId("63696c4e99703eb4ab9fba62") app_1 | } but if you will change command: "mongosh mongodb://user:password#mongo:27017/admin --eval \"printjson(db.test.insertOne({'a': 1}))\"" to command: "mongosh mongodb://user:password#mongo:27017/local --eval \"printjson(db.test.insertOne({'a': 1}))\"" you will see error. Even if you will add MONGO_INITDB_DATABASE to mongo with value local. You can test it running in second console command: docker-compose run app bash and then try mongosh mongodb://user:password#mongo:27017/admin --eval "printjson(db.test.insertOne({'a': 1}))" with success and mongosh mongodb://user:password#mongo:27017/local --eval "printjson(db.test.insertOne({'a': 1}))" that failing. You can see logs from mongo like mongo_1 | {"t":{"$date":"2022-11-07T20:40:35.686+00:00"},"s":"I", "c":"ACCESS", "id":20249, "ctx":"conn6","msg":"Authentication failed","attr":{"mechanism":"SCRAM-SHA-256","speculative":true,"principalName":"user","authenticationDatabase":"local","remote":"172.20.0.3:50382","extraInfo":{},"error":"UserNotFound: Could not find user \"user\" for db \"local\""}} mongo_1 | {"t":{"$date":"2022-11-07T20:40:35.687+00:00"},"s":"I", "c":"ACCESS", "id":20249, "ctx":"conn6","msg":"Authentication failed","attr":{"mechanism":"SCRAM-SHA-1","speculative":false,"principalName":"user","authenticationDatabase":"local","remote":"172.20.0.3:50382","extraInfo":{},"error":"UserNotFound: Could not find user \"user\" for db \"local\""}} mongo_1 | {"t":{"$date":"2022-11-07T20:40:35.688+00:00"},"s":"I", "c":"NETWORK", "id":22944, "ctx":"conn5","msg":"Connection ended","attr":{"remote":"172.20.0.3:50374","uuid":"b77fff1f-b832-4900-9c2d-1e7fd1e79424","connectionId":5,"connectionCount":1}} mongo_1 | {"t":{"$date":"2022-11-07T20:40:35.699+00:00"},"s":"I", "c":"NETWORK", "id":22944, "ctx":"conn6","msg":"Connection ended","attr":{"remote":"172.20.0.3:50382","uuid":"3995bcbf-706d-4bed-92a2-04736305b7c2","connectionId":6,"connectionCount":0}} this problem is described in topic User not found on MongoDB Docker image with authentication You can authenticate with user,password against admin db, not mydb You can read more about creating database with user and password here: How to create a DB for MongoDB container on start up?
Path to file is not forund of postgres script `COPY <table_name>(<columns>) FROM '<path>>' ...` within docker container using linux distribution
This issue has to do with the fact that the file exists on the backend container but not the postgres container. How could I transfer the file between containers automatically? I am currently trying to execute the following script: COPY climates( station_id, date, element, data_value, m_flag, q_flag, s_flag, obs_time ) FROM '/usr/api/2017.csv` DELIMITER ',' CSV HEADER; within a docker container running a sequelize backend connecting to a postgres:14.1-alpine container. The following error is returned: db_1 | 2022-08-30 04:23:58.358 UTC [29] ERROR: could not open file "/usr/api/2017.csv" for reading: No such file or directory db_1 | 2022-08-30 04:23:58.358 UTC [29] HINT: COPY FROM instructs the PostgreSQL server process to read a file. You may want a client-side facility such as psql's \copy. db_1 | 2022-08-30 04:23:58.358 UTC [29] STATEMENT: COPY climates( db_1 | station_id, db_1 | date, db_1 | element, db_1 | data_value, db_1 | m_flag, db_1 | q_flag, db_1 | s_flag, db_1 | obs_time db_1 | ) db_1 | FROM '/usr/api/2017.csv' db_1 | DELIMITER ',' db_1 | CSV HEADER; ebapi | Unable to connect to the database: MigrationError: Migration 20220829_02_populate_table.js (up) failed: Original error: could not open file "/usr/api/2017.csv" for reading: No such file or directory ebapi | at /usr/api/node_modules/umzug/lib/umzug.js:151:27 ebapi | at process.processTicksAndRejections (node:internal/process/task_queues:95:5) ebapi | at async Umzug.runCommand (/usr/api/node_modules/umzug/lib/umzug.js:107:20) ebapi | ... 2 lines matching cause stack trace ... ebapi | at async start (/usr/api/index.js:14:3) { ebapi | cause: Error ebapi | at Query.run (/usr/api/node_modules/sequelize/lib/dialects/postgres/query.js:50:25) ebapi | at /usr/api/node_modules/sequelize/lib/sequelize.js:311:28 ebapi | at process.processTicksAndRejections (node:internal/process/task_queues:95:5) ebapi | at async Object.up (/usr/api/migrations/20220829_02_populate_table.js:10:5) ebapi | at async /usr/api/node_modules/umzug/lib/umzug.js:148:21 ebapi | at async Umzug.runCommand (/usr/api/node_modules/umzug/lib/umzug.js:107:20) ebapi | at async runMigrations (/usr/api/util/db.js:52:22) ebapi | at async connectToDatabase (/usr/api/util/db.js:32:5) ebapi | at async start (/usr/api/index.js:14:3) { ebapi | name: 'SequelizeDatabaseError', ... Here is my docker-compose.yml # set up a postgres database version: "3.8" services: db: image: postgres:14.1-alpine restart: always environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres ports: - "5432:5432" volumes: - db:/var/lib/postgresql/data - ./db/init.sql:/docker-entrypoint-initdb.d/create_tables.sql api: container_name: ebapi build: context: ./energybot depends_on: - db ports: - 3001:3001 environment: DATABASE_URL: postgres://postgres:postgres#db:5432/postgres DB_HOST: db DB_PORT: 5432 DB_USER: postgres DB_PASSWORD: postgres DB_NAME: postgres links: - db volumes: - "./energybot:/usr/api" volumes: db: driver: local
NodeJS Typeorm doesn't see host in docker
I have 2 dockers composes. 1 implements an infrastructure with a reverse proxy, databases, database admins, etc. version: '3.7' volumes: mysql80_volume: name: MySql80-Volume services: reverse-proxy: image: traefik:v2.2 container_name: "reverse-proxy" restart: always network_mode: bridge ports: - "80:80" - "443:443" # etc... mysql80: container_name: mysql80 image: mysql:8.0 restart: always labels: - traefik.enable=false network_mode: bridge ports: - 3380:3306 environment: - MYSQL_ROOT_PASSWORD=root - MYSQL_PASSWORD=root volumes: - mysql80_volume:/var/lib/mysql - ./my.cnf:/etc/my.cnf And there is a docker-compose service, which describes the configs for the service. version: '3.7' services: server: container_name: project-api.com build: context: . dockerfile: docker/Dockerfile sysctls: - net.ipv4.ip_unprivileged_port_start=0 restart: always labels: - traefik.enable=true #labels for traefik extra_hosts: - "project-api.com www.project-api.com:127.0.0.1" external_links: - mysql80:mysql # <---- My link network_mode: bridge volumes: - .:/app I want to connect the database from docker-compose 1 to the docker-compose 2 file and pass it to the connection in the Typeform config. Config for typeorm type: "mysql", host: process.env.TYPEORM_ENDPOINT, database: process.env.TYPEORM_DB_NAME, port: parseInt(process.env.TYPEORM_PORT) || 3306, username: process.env.TYPEORM_USERNAME, password: process.env.TYPEORM_PASSWORD, .env TYPEORM_ENDPOINT=mysql TYPEORM_DB_NAME=red_driver TYPEORM_USERNAME=root TYPEORM_PASSWORD=root TYPEORM_PORT=3306 But I am getting an error. project-api.com | [nodemon] 2.0.7 project-api.com | [nodemon] to restart at any time, enter `rs` project-api.com | [nodemon] watching path(s): *.* project-api.com | [nodemon] watching extensions: ts,graphql project-api.com | [nodemon] starting `ts-node index.ts` project-api.com | Error: getaddrinfo ENOTFOUND mysql project-api.com | at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:71:26) project-api.com | -------------------- project-api.com | at Protocol._enqueue (/home/app/node_modules/mysql/lib/protocol/Protocol.js:144:48) project-api.com | at Protocol.handshake (/home/app/node_modules/mysql/lib/protocol/Protocol.js:51:23) project-api.com | at PoolConnection.connect (/home/app/node_modules/mysql/lib/Connection.js:116:18) project-api.com | at Pool.getConnection (/home/app/node_modules/mysql/lib/Pool.js:48:16) project-api.com | at /home/app/src/driver/mysql/MysqlDriver.ts:894:18 project-api.com | at new Promise (<anonymous>) project-api.com | at MysqlDriver.createPool (/home/app/src/driver/mysql/MysqlDriver.ts:891:16) project-api.com | at MysqlDriver.<anonymous> (/home/app/src/driver/mysql/MysqlDriver.ts:344:36) project-api.com | at step (/home/app/node_modules/typeorm/node_modules/tslib/tslib.js:141:27) project-api.com | at Object.next (/home/app/node_modules/typeorm/node_modules/tslib/tslib.js:122:57) { project-api.com | errno: -3008, project-api.com | code: 'ENOTFOUND', project-api.com | syscall: 'getaddrinfo', project-api.com | hostname: 'mysql', project-api.com | fatal: true project-api.com | }
The config property of typeorm must be the container name of MySQL. (host: 'mysql80')
docker-compose: nodejs container not communicating with postgres container
I did find a few people with a slightly different setup but with the same issue. So I hope this doesn't feel like a duplicated question. My setup is pretty simple and straight-forward. I have a container for my node app and a container for my Postgres database. When I run docker-compose up and I see the log both containers are up and running. The problem is my node app is not connecting to the database. I can connect to the database using Postbird and it works as it should. If I create a docker container only for the database and run the node app directly on my machine everything works fine. So it's not and issue with the DB or the app but with the setup. Here's a few useful information: Running a docker just for the DB (connects and works perfectly): > vigna-backend#1.0.0 dev /Users/lucasbittar/Dropbox/Code/vigna/backend > nodemon src/server.js [nodemon] 2.0.2 [nodemon] to restart at any time, enter `rs` [nodemon] watching dir(s): *.* [nodemon] watching extensions: js,mjs,json [nodemon] starting `node -r sucrase/register src/server.js` Initializing database... Connecting to DB -> vignadb | PORT: 5432 Executing (default): SELECT 1+1 AS result Connection has been established successfully -> vignadb Running a container for each using docker-compose: Creating network "backend_default" with the default driver Creating backend_db_1 ... done Creating backend_app_1 ... done Attaching to backend_db_1, backend_app_1 db_1 | db_1 | PostgreSQL Database directory appears to contain a database; Skipping initialization db_1 | db_1 | 2020-07-24 13:23:32.875 UTC [1] LOG: starting PostgreSQL 12.1 (Debian 12.1-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit db_1 | 2020-07-24 13:23:32.876 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432 db_1 | 2020-07-24 13:23:32.876 UTC [1] LOG: listening on IPv6 address "::", port 5432 db_1 | 2020-07-24 13:23:32.881 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432" db_1 | 2020-07-24 13:23:32.955 UTC [27] LOG: database system was shut down at 2020-07-23 13:21:09 UTC db_1 | 2020-07-24 13:23:32.999 UTC [1] LOG: database system is ready to accept connections app_1 | app_1 | > vigna-backend#1.0.0 dev /usr/app app_1 | > npx sequelize db:migrate && npx sequelize db:seed:all && nodemon src/server.js app_1 | app_1 | app_1 | Sequelize CLI [Node: 14.5.0, CLI: 5.5.1, ORM: 5.21.3] app_1 | app_1 | Loaded configuration file "src/config/database.js". app_1 | app_1 | Sequelize CLI [Node: 14.5.0, CLI: 5.5.1, ORM: 5.21.3] app_1 | app_1 | Loaded configuration file "src/config/database.js". app_1 | [nodemon] 2.0.2 app_1 | [nodemon] to restart at any time, enter `rs` app_1 | [nodemon] watching dir(s): *.* app_1 | [nodemon] watching extensions: js,mjs,json app_1 | [nodemon] starting `node -r sucrase/register src/server.js` app_1 | Initializing database... app_1 | Connecting to DB -> vignadb | PORT: 5432 My database class: class Database { constructor() { console.log('Initializing database...'); this.init(); } async init() { let retries = 5; while (retries) { console.log(`Connecting to DB -> ${databaseConfig.database} | PORT: ${databaseConfig.port}`); const sequelize = new Sequelize(databaseConfig); try { await sequelize.authenticate(); console.log(`Connection has been established successfully -> ${databaseConfig.database}`); models .map(model => model.init(sequelize)) .map( model => model.associate && model.associate(sequelize.models)); break; } catch (err) { console.log(`Error: ${err.message}`); retries -= 1; console.log(`Retries left: ${retries}`); // Wait 5 seconds before trying again await new Promise(res => setTimeout(res, 5000)); } } } } Dockerfile: FROM node:alpine WORKDIR /usr/app COPY package*.json ./ RUN npm install COPY . . EXPOSE 3333 CMD ["npm", "start"] docker-compose.yml: version: "3" services: db: image: postgres restart: always environment: POSTGRES_PASSWORD: postgres POSTGRES_USER: postgres POSTGRES_DB: vignadb volumes: - ./pgdata:/var/lib/postgresql/data ports: - "5432:5432" app: build: . depends_on: - db ports: - "3333:3333" volumes: - .:/usr/app command: npm run dev package.json (scrips only): "scripts": { "dev-old": "nodemon src/server.js", "dev": "npx sequelize db:migrate && npx sequelize db:seed:all && nodemon src/server.js", "build": "sucrase ./src -d ./dist --transforms imports", "start": "node dist/server.js" }, .env: # Database DB_HOST=db DB_USER=postgres DB_PASS=postgres DB_NAME=vignadb DB_PORT=5432 database config: require('dotenv/config'); module.exports = { dialect: 'postgres', host: process.env.DB_HOST, username: process.env.DB_USER, password: process.env.DB_PASS, database: process.env.DB_NAME, port: process.env.DB_PORT, define: { timestamp: true, underscored: true, underscoredAll: true, }, }; I know I'm messing up something I just don't know where. Let me know if I can provide more information. Thanks!
You should put your 2 containers in the same network https://docs.docker.com/compose/networking/ And call your db service inside your nodejs connexion string. Something like: postgres://db:5432/vignadb
mangoose trying to connect wrong ip and showing err connection refused during dockerization
my docker-compose.yml version: '3.5' # specify docker-compose version # Define the services/ containers to be run services: angular: # name of the first service build: frontend # specify the directory of the Dockerfile ports: - "80:80" # specify port mapping express: # name of the second service build: backend # specify the directory of the Dockerfile restart: always ports: - "100:3000" #specify ports mapping links: - mongo # link this service to the database service mongo: # name of the third service image: mongo # specify image to build container from container_name: mongo ports: - "27017:27017" # specify port forwarding when i issue docker-compose up express in server its showing error in this line mongoose.connect('mongodb://mongo:27017/mydb', {useNewUrlParser: true}) error is express_1 | { MongoNetworkError: failed to connect to server [mongo:27017] on first connect [MongoNetworkError: connect ECONNREFUSED 172.18.0.2:27017] express_1 | at Pool.<anonymous> (/usr/src/app/node_modules/mongodb/lib/core/topologies/server.js:438:11) express_1 | at Pool.emit (events.js:198:13) express_1 | at createConnection (/usr/src/app/node_modules/mongodb/lib/core/connection/pool.js:561:14) express_1 | at connect (/usr/src/app/node_modules/mongodb/lib/core/connection/pool.js:994:11) express_1 | at makeConnection (/usr/src/app/node_modules/mongodb/lib/core/connection/connect.js:31:7) express_1 | at Socket.err (/usr/src/app/node_modules/mongodb/lib/core/connection/connect.js:294:7) express_1 | at Object.onceWrapper (events.js:286:20) express_1 | at Socket.emit (events.js:198:13) express_1 | at emitErrorNT (internal/streams/destroy.js:91:8) express_1 | at emitErrorAndCloseNT (internal/streams/destroy.js:59:3) express_1 | at process._tickCallback (internal/process/next_tick.js:63:19) express_1 | name: 'MongoNetworkError', express_1 | [Symbol(mongoErrorContextSymbol)]: {} } why its trying to connect 172.18.0.2:27017 instead of localhost:27017 or docker(192.168.99.100:27017) thanks in advance scratching my head from last 2 days