以下是我所面临的问题的一个简单示例。
简而言之:我提交初始容器并从提交的容器中创建一个新容器后,我将从Docker容器中删除的文件重新出现。
我有以下Dockerfile:
FROM ubuntu:latest
VOLUME /docker-entrypoint-initdb.d
COPY docker-entrypoint.sh /usr/local/bin/
COPY docker-entrypoint-initdb.sh /usr/local/bin/
COPY delete-me.sh /docker-entrypoint-initdb.d/setup/
ENTRYPOINT "docker-entrypoint.sh"
我设置了一个VOLUME并将一些文件复制到容器中。
docker-entrypoint.sh =>如Dockerfile中所见的实际入口点
#!/usr/bin/env bash
docker-entrypoint-initdb.sh && exec /bin/bash -c "trap : TERM INT; sleep infinity & wait"
docker-entrypoint-initdb.sh =>包含创建容器时应运行的命令的脚本。 (在我的真实世界项目中,其中一些应始终运行,有些仅在第一次运行。脚本基本上遍历文件夹 /docker-entrypoint-initdb.d/setup / 并运行所有脚本它。)
#!/usr/bin/env bash
sh /docker-entrypoint-initdb.d/setup/delete-me.sh
rm -R /docker-entrypoint-initdb.d/setup/ 2> /dev/null
delete-me.sh =>此文件包含的逻辑应该仅在第一次从此映像创建容器时运行。在所有后续运行中,此文件将销毁数据并使容器无法使用。
echo DELETE_ME
使用comman docker build -f Dockerfile -t ubu-test
构建容器。
使用docker run -d ubu-test
运行。
我第一次运行容器后,它已正确设置。脚本 delete-me.sh 运行,然后被 docker-entrypoint-initdb.sh 删除。
docker commit
在第一次运行后的容器。
现在出现问题:当我从提交的容器创建一个新容器时,文件 delete-me.sh 再次出现。
我不明白为什么。 (我确认它已在我docker exec -it
提交的容器中删除了。)
答案 0 :(得分:0)
问题是由音量引起的。正如docs for docker commit:
中所述提交操作不包括容器内安装的卷中包含的任何数据。
Docker提交会将容器文件系统更改提交到新映像中。由于/docker-entrypoint-initdb.d
是一个卷,
在此目录下完成的所有文件更改都不会成为提交容器的一部分,因为卷不会存储在写入时复制中
存储容器的文件系统。
作为解决方案,您可以从Dockerfile中删除VOLUME
声明。
或者,为卷命名并重复使用它:
docker run -v initdb:/docker-entrypoint-initdb.d -d ubu-test