首页 > 解决方案 > 如何使用`docker cp`来`--no-clobber`?从 Docker 容器复制文件,但如果目标已存在则不覆盖

问题描述

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

docker cp MY_CONTAINER_NAME:/path/to/file /destination/path

但是,docker cp似乎没有--no-clobber像常规那样的选项cp。那么,如果文件已经存在,我如何在不覆盖目标的情况下复制文件呢?

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

标签: dockercopyrace-conditioncp

解决方案


我会使用以下脚本:

#!/bin/bash

set -o noclobber
{ > /destination/path ; } &> /dev/null

if [ $? -ne 0 ] ; then
    echo 'already exists!'
    exit 1
fi

docker cp MY_CONTAINER_NAME:/path/to/file /destination/path

noclobber将防止重定向输出时意外覆盖。如果文件已经存在,重定向将返回非零退出代码。

编辑:

我发现这个 SO 答案使用完全相同的解决方案:atomic create file if not exists from bash script

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


推荐阅读