我正在设置一个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
在构建图像时,我可以看到用户已成功添加,但是当我运行图像时,容器中的数据库不包含任何用户。
为什么不在图像中捕获用户?如何在图像构建过程中添加用户?
答案 0 :(得分:3)
原因是mongo映像使用VOLUME
作为数据目录,这使得docker将数据库数据存储在外部,并且该数据不会保留在映像中(参见用于mongo的Dockerfile:3.2图像; 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