我想为 MongoDB 创建一个 Dockerfile,它将启动 mongod 并使用 .json 文件为数据库播种(如果已安装)。
这是目前的样子:
FROM mongo:7.0.6
COPY ./tools/db /import
RUN echo -e "mongod; for f in /import/*.json; do name=\$(basename \$f | cut -d'.' -f1); mongoimport --db=APPDB --collection=\$name --jsonArray --file=\$f; done;" > /usr/local/bin/run.sh
RUN chmod 777 /usr/local/bin/run.sh
CMD ["/usr/local/bin/run.sh"]
当我运行这个容器时,mongod 命令之后的所有内容都不会运行。但是,如果我登录到容器,我可以运行 shell 脚本并且导入工作正常。我想我明白为什么这不起作用,因为“mongod”接管终端并且不交回控制权,因此数据播种不执行。我尝试向 mongod 添加“--fork”标志,但似乎 mongod 甚至不是以此开始的。
有办法让它发挥作用吗?
Mongo DB 通常通过图像入口点启动。图像上有一个特定的文件夹
/docker-entrypoint-initdb.d/
,用于存放启动脚本。我建议如下:
run.sh
相同的文件夹中创建文件 Dockerfile
。#!/bin/bash
for f in /import/*.json
do
name=$(basename $f | cut -d'.' -f1)
mongoimport --db=APPDB --collection=$name --jsonArray --file=$f
done
run.sh
复制到 /docker-entrypoint-initdb.d/
。FROM mongo:7.0.6
COPY ./tools/db /import
COPY run.sh /docker-entrypoint-initdb.d/
如果您现在构建并运行图像,您应该会发现 JSON 种子文件在数据库启动时导入。