如何使用“docker cp”`--no clobber`?从Docker容器复制文件,但如果目标已存在,则不覆盖

如何使用“docker cp”`--no clobber`?从Docker容器复制文件,但如果目标已存在,则不覆盖,docker,copy,race-condition,cp,Docker,Copy,Race Condition,Cp,我想从Docker容器中复制文件: docker cp MY_CONTAINER_NAME:/path/to/file /destination/path 但是,它似乎不像常规的cp那样有一个——没有clobber选项。那么,如果目标文件已经存在,如何在不覆盖目标文件的情况下复制该文件呢 在运行docker cp之前简单地检查目的地的存在性不是原子性的,并且容易受到竞争条件的影响。我将使用以下脚本: #/bin/bash set-o noclobber {>/destination/path;

我想从Docker容器中复制文件:

docker cp MY_CONTAINER_NAME:/path/to/file /destination/path
但是,它似乎不像常规的
cp
那样有一个
——没有clobber
选项。那么,如果目标文件已经存在,如何在不覆盖目标文件的情况下复制该文件呢


在运行
docker cp
之前简单地检查目的地的存在性不是原子性的,并且容易受到竞争条件的影响。

我将使用以下脚本:

#/bin/bash
set-o noclobber
{>/destination/path;}&>/dev/null
如果[$?-ne 0];然后
echo“已经存在!”
出口1
fi
docker cp我的容器名称:/path/to/file/destination/path
重定向输出时,
noclobber
将防止意外覆盖。如果文件已经存在,重定向将返回非零退出代码

编辑:

我发现这个答案使用了完全相同的解决方案:


也许其他评论会有所帮助。

好吧,这取决于你如何检查目的地的存在。使用此解决方案,您尝试创建目标路径,如果它存在,则不会进行复制。无论如何,如果您仅在某些地方使用此类脚本,它很容易受到竞争条件的影响。如果目标是文件夹,则可以使用
mkdir
。正如您所说,目前docker cp不支持--noclobber。我为你的问题提供了另一种解决办法。另一种解决方案是将内容复制到其他地方,然后使用普通的
cp--noclobber
,但这只会将竞争条件问题从目标移动到临时文件夹。此解决方案解决竞争条件,因为目标文件的创建/检查是一个原子操作。如果原子操作失败,脚本将结束。我建议手动测试一下。让这个脚本执行1000次,并放置一些随机等待来模拟竞争条件的可能性。是的,我同意,检查和创建是原子的。但是,另一个进程仍可能在
{>/destination/path;}&>/dev/null
docker cp
之间写入文件。在这么短的时间内,我无法区分是我自己创建的(空)文件,还是由另一个进程(重新)创建/修改的文件。