来自Dockerfile RUN数据的数据不在映像中

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

为此,我创build了这个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 

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

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

原因是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