我正在尝试创建一个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',
});
答案 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脚本中切换数据库。