mongodb - 来自Dockerfile RUN步骤的数据不在镜像中

标签 mongodb docker dockerfile

我正在设置一个MongoDB容器来针对其运行软件集成测试,并且我想让docker文件将测试用户添加到数据库中,以便测试可以登录并执行其步骤。我希望能够捕获Dockerfile中的所有步骤,所以我试图避免启动容器,手动添加用户,然后重新捕获图像。

为此,我创建了这个Dockerfile:

FROM mongo:3.2.0
COPY add_user.sh /
RUN /add_user.sh

并且add_user.sh包含:
#!/bin/bash
mongod &

RET=1
while [[ RET -ne 0 ]]; do
    sleep 1
    mongo admin --eval "help" >/dev/null 2>&1
    RET=$?
done

echo "Adding testUser..."
mongo admin --eval "db.createUser({user:'testUser',pwd:'P@ssw0rd',roles:['readWrite']})"

echo "User added"
mongo admin --eval "db.getUsers()"

mongod --shutdown

在构建镜像时,我可以看到已经成功添加了用户,但是在运行镜像时,容器中的数据库不包含任何用户。

为什么没有在图像中捕获用户?在镜像构建过程中如何添加用户?

最佳答案

原因是mongo镜像在数据目录中使用VOLUME,这使docker将数据库数据存储在镜像之外,并且数据未持久存在于镜像中(有关mongo:3.2镜像,请参见Dockerfile; https://github.com/docker-library/mongo/blob/fcb9584617e63f1d3db8dc730fb8abb83653c7ad/3.2/Dockerfile#L54)

因此,即使命令已成功运行,数据库本身也存储在镜像之外。

在docker中,使用卷是为了使数据独立于容器的生命周期持久保存(即,您可以销毁容器,但是卷内的数据保持不变,以便您可以使用相同的卷/数据)

缺点是,如果Dockerfile使用VOLUME声明,则无法“烘焙”图像中的数据。

有关此问题的一些讨论,请参见https://github.com/docker/docker/issues/18287https://github.com/docker/docker/issues/3465

关于mongodb - 来自Dockerfile RUN步骤的数据不在镜像中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34700520/

相关文章:

node.js - 新的 package.json 包没有显示在 Docker 容器中

json - mongoimport 失败与 "The _id field cannot be changed from"不一致

javascript - 404 错误, 'get' 从本地托管服务器获取请求

django - ValueError : Missing staticfiles manifest entry on Heroku with Docker, django-pipeline, whitenoise

docker - 如何将我的 docker 连接到互联网?

mysql - docker-compose 如何链接一个现有的 mariadb 而不是创建一个新的

linux - 使用 Dockerfile ENTRYPOINT 找不到 exec

Java Spark : com. mongodb.spark.config.writeconfig 问题

mongodb - 如何使用 Mongoose 访问预先存在的集合?

php - Alpine Linux 上的甲骨文