docker cp 一个带有相对符号链接的文件夹:无效的符号链接

Posted

技术标签:

【中文标题】docker cp 一个带有相对符号链接的文件夹:无效的符号链接【英文标题】:docker cp a folder with a relative symlink: invalid symlink 【发布时间】:2016-03-04 03:57:17 【问题描述】:

在我的容器中,我有一个文件夹,其中包含指向父级父子文件夹的相对符号链接:

$ docker run --name symlink-test ubuntu bash -c "mkdir -p /1/2; touch /1/2/a; ln -s ../../usr /1/2; touch /1/2/z; ls -l /1/2"                                               :(
total 4
-rw-r--r--. 1 root root 0 Mar  4 03:37 a
lrwxrwxrwx. 1 root root 9 Mar  4 03:37 usr -> ../../usr
-rw-r--r--. 1 root root 0 Mar  4 03:37 z

我想将文件夹/1 复制到主机。但是,我总是收到以下错误:

$ docker cp symlink-test:/1/2
invalid symlink "/tmp/2/usr" -> "../../usr"
$ ls 2
a

复制文件失败,docker cp 在看到符号链接后中止。

有一些与此相关的 Docker 错误,但它们要么是固定的,要么是由其他原因引起的:

FATA[0000] invalid symlink when copying a symlink with relative parent paths Error attempting to cp directory containing symlink

我在 Fedora 23 上运行 Docker 1.10.2。

docker cp 的上述行为是有意的还是一个错误?如果是有意的,背后的原因是什么?

【问题讨论】:

当您执行 docker cp 时,容器中的当前 WORKDIR 是什么? 当前WORKDIR为Ubuntu镜像的默认WORKDIR,即/ 【参考方案1】:

就我而言,我通过以下方式使其工作:

docker cp -L container:/path/to/file.png current/directory/file.png

【讨论】:

【参考方案2】:

我不知道这种行为是否是故意的,但这里有一个解决方法:

docker cp my-container:/path/to/dir - | tar -x

【讨论】:

【参考方案3】:

你可以docker exec -it <container> sh然后找到你要复制的文件的符号链接readlink -f symlinkName,然后docker cp那个。

【讨论】:

感谢您的提示,但这并不能回答问题。【参考方案4】:

“docker cp -L”将在相对符号链接上失败,您应该将它们修复为完整路径。

例如 无效的符号链接“/tmp/2/usr”->“../../usr” usr 是 ../../usr 的相对符号链接。 而是将其更改为: usr -> /full/path/to/usr/

另一个例子: 无效的符号链接“/working_folder/XXX/lib”->“../../lib”

因为:lib -> ../../lib/ 修复它:lib -> /full/path/to/lib/

它将通过以下方式工作: docker cp -L /full/path/to/working_folder:/working_folder/

【讨论】:

以上是关于docker cp 一个带有相对符号链接的文件夹:无效的符号链接的主要内容,如果未能解决你的问题,请参考以下文章

cp复制时软链接问题

如何使用指向复制的新文件的符号链接进行 cp? [关闭]

Docker命令之四:docker cp

带有符号链接的 docker ADD

强制 PHP 作曲家创建本地存储库的相对而非绝对符号链接

cp:复制文件或目录