从提交的Docker容器运行时,重新显示已删除的文件

时间:2018-03-14 13:47:48

标签: docker dockerfile

以下是我所面临的问题的一个简单示例。

简而言之:我提交初始容器并从提交的容器中创建一个新容器后,我将从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提交的容器中删除了。)

1 个答案:

答案 0 :(得分:0)

问题是由音量引起的。正如docs for docker commit

中所述
  

提交操作不包括容器内安装的卷中包含的任何数据。

Docker提交会将容器文件系统更改提交到新映像中。由于/docker-entrypoint-initdb.d是一个卷, 在此目录下完成的所有文件更改都不会成为提交容器的一部分,因为卷不会存储在写入时复制中 存储容器的文件系统。

作为解决方案,您可以从Dockerfile中删除VOLUME声明。

或者,为卷命名并重复使用它:

docker run -v initdb:/docker-entrypoint-initdb.d -d ubu-test