我正在尝试在docker容器启动后执行命令。
这是我的Dockerfile
FROM mysite:myport/mongo:3.6
EXPOSE 27017
ADD mongo.js /data/mongodb/scripts/
这是我的docker-compose.yml
mongo:
image: test-mongo
container_name: test-mongo
hostname: mongo
expose:
- "27017"
ports:
- "27017:27017"
command: mongo --eval load("/data/mongodb/scripts/mongo.js")
docker-compose --no-ansi up返回我
Creating test-mongo ...
Creating test-mongo ... done
Attaching to test-mongo
test-mongo | MongoDB shell version v3.6.5
test-mongo | connecting to: mongodb://127.0.0.1:27017
test-mongo | 2018-06-09T15:46:50.229+0000 W NETWORK [thread1] Failed to connect to 127.0.0.1:27017, in(checking socket for error after poll), rea
son: Connection refused
test-mongo | 2018-06-09T15:46:50.229+0000 E QUERY [thread1] Error: couldn't connect to server 127.0.0.1:27017, connection attempt failed :
test-mongo | connect@src/mongo/shell/mongo.js:251:13
test-mongo | @(connect):1:6
test-mongo | exception: connect failed
test-mongo exited with code 1
我不明白如何在 mongodb启动后加载我的文件
答案 0 :(得分:1)
通过在command
中传递docker-compose.yaml
,您覆盖 mongo
图像的正常行为 - 因此mongo服务器永远不会启动。您通常处理此问题的方法是将脚本放入第二个映像,然后启动第二个容器作为docker-compose.yaml
的一部分,该容器与mongo服务器建立网络连接。类似的东西:
version: "3"
services:
mongo:
image: mongo
client:
image: my-mongo-client
restart: on-failure
command: mongo --host mongo --eval load("/data/mongodb/scripts/mongo.js")
restart
指令将导致客户端容器重新启动
自动失败,这是必要的,因为它可能会尝试
在mongo服务器可用于处理连接之前连接。
答案 1 :(得分:1)
如果您要做的只是初始化一个新数据库,例如创建一个新的架构并添加一个用户,则可以创建一个初始化脚本并将其加载到容器中。从Docker Hub documentation:
首次启动容器时,它将执行/docker-entrypoint-initdb.d中带有扩展名.sh和.js的文件。文件将按字母顺序执行。 .js文件将由mongo使用MONGO_INITDB_DATABASE变量指定的数据库执行(如果存在),否则进行测试。您也可以在.js脚本中切换数据库。