来自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