我正在尝试启动一个mongo docker镜像,该镜像在docker容器启动后将具有两个 .js 文件和一个 .sh 文件,它将启动setup.sh脚本,将执行两个 .js 文件。
想法是创建此docker映像,该映像将在启动后在远程docker容器执行js文件中创建副本集并创建 replicaSet ,然后将其创建 在将创建用户,创建数据库和创建初始集合的同一远程docker容器上执行另一个.js文件。
所有docker容器都将以 docker-compose 开始,因此它将启动3个mongo docker容器,第四个将是使用 Docker 文件创建的此自定义
当我启动所有容器时(我没有放置命令来自动启动脚本以进行检查)并输入第四个容器并手动运行脚本
它会指出.js文件不存在,即使该文件位于.sh脚本所在的文件夹中(已在 Dockerfile 中复制了COPY
函数),但问题是
我在mongo mongodb://mongo-docker-container-name:27017 replicaSet.js
之后从命令行运行docker exec -it
到容器中,这没有问题。
之后,我尝试将mongodb://mongo-docker-container-name:27017 --eval "rs.intiate({_id: "rs0", "members": [{"_id": 0, "host": "mongo-docker-container-name"},...]})"
放入 sh 脚本中,但遇到了问题,但是
当docker exec -it
之后在bash上执行相同的命令时,它将起作用。
在docker compose文件中,三个常规的mongo docker容器以command: --replSet rs0
开始
Dockerfile
FROM mongo
# created workdir in order not to put files in the entrypoint since they need to be executed on the remote docker-container
WORKDIR /user/src/configs
COPY replicaSet.js
COPY init.js
COPY setup.sh
COPY ["./setup.sh"]
replicaSet.js
var conf = {object for replicaSet like on mongo docs};
rs.initiate(conf);
rs.conf();
init.js
db.createUser({object for new user})
db = db.getSiblingDB('newDB')
db.createCollection('newcollection')
setup.sh
#did not put the #!/bin/bash because the mongo images does not have bash
echo "replica set initalizing"
mongo mongodb://mongo-docker-name-from-compose:27017 replicaSet.js
echo "initialised"
看了很多其他人如何做到这一点,但就我而言,它的行为不正确。
想法是启动docker-compose up
来构建用于安装程序的docker映像(此连接到主mongo容器并执行js)时,将启动所有三个容器,第四个将等待这三个容器启动,然后在第四步开始执行此sh。