从另一个容器连接到mongo-连接被拒绝

时间:2019-12-15 16:03:51

标签: mongodb docker docker-compose

我正在尝试创建一个mongo在另一个容器中运行的docker文件,以从文件执行命令,但是第二个容器收到连接被拒绝的错误:

mongo-testdata_1  | MongoDB shell version: 3.2.9
mongo-testdata_1  | connecting to: mongo:27017/admin
mongo-testdata_1  | 2019-12-15T15:57:30.067+0000 W NETWORK  [thread1] Failed to connect to 127.0.0.1:27017, reason: errno:111 Connection refused
mongo-testdata_1  | 2019-12-15T15:57:30.067+0000 E QUERY    [thread1] Error: couldn't connect to server 127.0.0.1:27017, connection attempt failed :
mongo-testdata_1  | @./testData.js:1:20
mongo-testdata_1  | 
mongo-testdata_1  | failed to load: ./testData.js

如何使用第二个容器中的mongo cli连接到第一个容器上运行的mongoDB?

使用的命令

docker-compose up -d mongo
docker exec my-test-mongo mongo --eval "db.createUser({ user: 'admin', pwd: 'password', roles: [ 'dbAdmin', 'readWrite' ] });" admin
docker-compose up --build mongo-testdata

mongo.dockerfile

FROM mongo:3.2.9

ADD testData.js .

ENTRYPOINT ["mongo"]

docker-compose.yml

version: '2'
services:
  mongo-testdata:
    build:
      context: .
      dockerfile: mongo.dockerfile
    command: --host mongo --port 27017 --username='admin' --password='password' admin ./testData.js
    depends_on:
      - mongo
    networks:
      - backend

  mongo:
    image: mongo:3.2.9
    container_name: my-test-mongo
    ports:
      - 27017:27017
    networks:
      - backend

networks:
  backend:
    driver: bridge

testData.js

const myDb = new Mongo().getDB('mydb');

myDb.getCollection('test').insert({
  foo: 'bar',
});

2 个答案:

答案 0 :(得分:1)

testData.js中连接到mongo时,需要指定主机和端口。

new Mongo(<host:port>)

在您的情况下为new Mongo('mongo')

https://docs.mongodb.com/v3.2/reference/method/Mongo/#Mongo

  

实例化选项   使用不带参数的构造函数可在默认端口上实例化与localhost接口的连接。

     

将参数传递给构造函数以实例化与和默认端口的连接。

     

将<:port>参数传递给构造函数,以实例化与和的连接。

答案 1 :(得分:0)

唯一的depends_on将不起作用,因为在CLI拒绝连接时,mongo DB容器进程尚未准备好接受容器。您可以尝试两种选择 -只需使睡眠一秒钟,数据库容器将准备接受连接 -增加mongo shell连接的等待超时时间

这是通过在导入中添加10秒的Seelp来处理被拒绝的连接的方法。

version: '2'
services:
  mongo_import:
    image: mongo
    command: /bin/bash -c "sleep 10 && mongo --host mongo --port 27017 --username='admin' --password='password' admin /root/testData.js"
    volumes:
      - ./testData.js:/root/testData.js
    depends_on:
      - mongo

  mongo:
    image: mongo
    container_name: my-test-mongo
    ports:
      - 27017:27017

您可以在同一容器中执行上述任务,而无需任何cli容器。

初始化一个新实例

  

首次启动容器时,它将执行文件   带有扩展名.sh and .js,位于   /docker-entrypoint-initdb.d。文件将按字母顺序执行   订购。 .js文件将由mongo使用数据库执行   由MONGO_INITDB_DATABASE变量指定(如果存在),或者   否则测试。您也可以在.js脚本中切换数据库。

Initializing a fresh instance