我正在设置一个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/18287和https://github.com/docker/docker/issues/3465
关于mongodb - 来自Dockerfile RUN步骤的数据不在镜像中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34700520/