Dockerfile RUN步骤中的数据不在图像中

时间:2016-01-10 00:15:47

标签: 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

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

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

1 个答案:

答案 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/18287https://github.com/docker/docker/issues/3465