Docker cp命令无法覆盖文件

11
我想在docker中运行一些测试,因此加载我的更新代码到现有容器中以节省每次重建镜像的时间。
docker cp似乎是解决这个问题的理想方案-但它似乎不能覆盖我的现有文件,这是我进行的简短测试。我在本地创建了一个新文件,将其复制到容器中,在本地更改文件后,再次复制它,并比较更改之前和之后容器内文件的内容。
>> touch test123
>> docker cp test123 my-container:/
>> docker exec my-container cat /test123
(empty)
>> vi test123
(add some text on my local machine)
>> docker cp test123 my-container:/
>> docker exec my-container cat /test123
(empty)
>> vi test123
(check if the content was saved –> yes)

正如我们所看到的,更改并没有被复制。当复制整个文件夹时(这实际上是我计划要做的事情),同样的情况也发生了。Docker Docs中提到:DEST_PATH存在且是一个文件,则目标将被源文件内容覆盖,所以我想知道我在这里做错了什么。
容器的Docker镜像基于ubuntu:16.04
非常感谢您的帮助。

我无法重现这个问题。docker cp 命令会按照预期覆盖文件。你的第二个 exec 命令前面缺少 docker,这可能是问题所在。不管怎样,最好将主机目录挂载到容器中,而不是在每次本地开发时复制文件。 - Sven Koschnicke
@SvenKoschnicke 不,docker 命令并没有丢失,那是我在复制到 SO 时犯的错误。如果您无法重现,可能是版本问题(我的 Mac 版本是 17.12.0-ce)?我将尝试挂载它,但这不会很好地融入开发流程中。 - Deproblemify
我在Linux上使用的是版本18.01.0-ce。当然,这可能是你的版本存在的一个bug,但我认为这种可能性很小。复制文件比直接挂载它更好吗? - Sven Koschnicke
你尝试使用容器ID了吗? - Shahriar
1个回答

8
最近Docker发布了一次更新以解决这个问题。我在更新后运行了相同的程序(新版本为17.12.0-ce-mac55),现在覆盖操作已经生效。
这可能是由于macOS High Sierra和新的文件系统APFS引起的问题。此次更新提到它修复了一个与大量文件相关的磁盘/镜像损坏问题(详情请见Disk/image corruption with large numbers of files)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接