重新创建MongoDB容器不会在docker-entrypoint-initdb.d中重新运行config.js文件

时间:2019-06-06 11:08:13

标签: mongodb docker docker-compose devops

我对MongoDB有问题。我正在将config.js文件中的文件docker-entrypoint-initdb.d设置为docker-compose

mongo:
  image: mongo:latest
  restart: always
  ports:
    - 27017:27017
  environment:
    MONGO_INITDB_ROOT_USERNAME: root
    MONGO_INITDB_ROOT_PASSWORD: example
    MONGO_INITDB_DATABASE: dev
  volumes:
    - ./config.js:/docker-entrypoint-initdb.d/config.js
    - mongodbdata:/data/db

config.js文件如下所示:

db.auth('root', 'example');

db = db.getSiblingDB('dev');

db.approver.insert({"email":"some@email.com,"approverType":"APPROVER"});
db.approver.insert({"email":"someother@email.com","approverType":"ACCOUNTANCY"});

当我第一次运行docker-compose up -d时,一切都很好,这两个条目都插入到数据库中。

但是,我想添加一个trird条目,然后重新创建容器:

db.auth('root', 'example');

db = db.getSiblingDB('dev');

db.approver.insert({"email":"some@email.com,"approverType":"APPROVER"});
db.approver.insert({"email":"someother@email.com","approverType":"ACCOUNTANCY"});
db.approver.insert({"email":"another@email.com","approverType":"ACCOUNTANCY"});

我运行docker-compose up -d --force-recreate --no-deps mongo没有任何反应。重新创建了容器,但是第三个条目不存在。

运行docker exec -it dev_mongo_1 mongo docker-entrypoint-initdb.d/config.js返回:

MongoDB shell version v4.0.10
connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("d44b8e0a-a32c-4da0-a02b-c3f71d6073dd") }
MongoDB server version: 4.0.10
Error: Authentication failed.

是否可以重新创建容器,以便重新运行脚本?还是运行mongo命令,该命令将在正在运行的容器中重新运行脚本?

1 个答案:

答案 0 :(得分:0)

在mongodb的启动脚本中,检查是否应进行初始化: https://github.com/docker-library/mongo/blob/40056ae591c1caca88ffbec2a426e4da07e02d57/3.6/docker-entrypoint.sh#L225

    # check for a few known paths (to determine whether we've already initialized and should thus skip our initdb scripts)
    if [ -n "$shouldPerformInitdb" ]; then
    ...

因此它可能仅在数据库初始化期间完成了一次,然后,当您使用mongodbdata:/data/db保持数据库状态时,它将不会初始化。

为解决此问题,您可以尝试键入docker-compose down -v,这将从数据库中删除数据,并让您再次运行初始化。