Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是Docker COPY';s关于符号链接的规则/如何保留符号链接?_Docker_Dockerfile_Copy_Symlink - Fatal编程技术网

什么是Docker COPY';s关于符号链接的规则/如何保留符号链接?

什么是Docker COPY';s关于符号链接的规则/如何保留符号链接?,docker,dockerfile,copy,symlink,Docker,Dockerfile,Copy,Symlink,从本次试验来看,Docker的COPY命令似乎没有保留符号链接,而是“跟随”符号链接并复制目标文件(?): 无论是从上下文还是从另一个Docker图像层复制,此行为都是相同的 是否有办法让Docker copy保留符号链接,即“跟踪”它们并创建硬文件?还是有一些惯例来解决这种情况 这个问题背后的背景是,我复制的基础层(很多)混合了指向它们的文件和符号链接。示例:libfoo.so->libfoo.so.1->libfoo.so.1.0.0 我花了一段时间在网上搜索这个话题,但出人意料地发现很少

从本次试验来看,Docker的
COPY
命令似乎没有保留符号链接,而是“跟随”符号链接并复制目标文件(?):

无论是从上下文还是从另一个Docker图像层复制,此行为都是相同的

是否有办法让Docker copy保留符号链接,即“跟踪”它们并创建硬文件?还是有一些惯例来解决这种情况

这个问题背后的背景是,我复制的基础层(很多)混合了指向它们的文件和符号链接。示例:
libfoo.so->libfoo.so.1->libfoo.so.1.0.0



我花了一段时间在网上搜索这个话题,但出人意料地发现很少有点击率。大多数“接近”的问题都是关于指向目录的符号链接,这与我的情况不同。我得到的最接近的答案是一个不幸的未回答的问题:

如果您尝试将整个目录作为一个单元复制,而不是尝试复制目录中的文件,则此方法有效:

复制//foo/bar/
请注意,复制目录有一些微妙之处:注意,如果您
COPY
a目录

注意:目录本身没有被复制,只是它的内容


对于您试图复制整个构建上下文的情况,这是很好的。如果您有要复制的子目录,则需要确保子目录名也位于
copy
的右侧,并且目录名以
/
结尾。

复制目录是否比复制单个文件/符号链接更有效?(这与
/bin/cp
是一致的;它在@DavidMaze中没有很好的记录——这确实有效;非常感谢。起初,我认为我的实际情况比我的MCVE更难做到这一点,因为源目录和目标目录结构不同……但这并不重要:只要我指定完整的源路径(以
/
结尾)和完整的目标路径,这就行得通。
$ ls -l
total 4
lrwxrwxrwx 1 user domain users  1 Mar 26 09:37 a -> b
-rw-r--r-- 1 user domain users  0 Mar 26 09:37 b
lrwxrwxrwx 1 user domain users  1 Mar 26 09:41 c -> d
-rw-r--r-- 1 user domain users  0 Mar 26 09:41 d
-rw-r--r-- 1 user domain users 54 Mar 26 09:39 Dockerfile
$
# Dockerfile
FROM alpine:3.7 as base

COPY [ "./*", "/foo/bar/" ]
$ docker build -t foo:tmp . && docker run -it foo:tmp
[+] Building 1.1s (7/7) FINISHED
 => [internal] load build definition from Dockerfile                                                                       0.0s
 => => transferring dockerfile: 116B                                                                                       0.0s
 => [internal] load .dockerignore                                                                                          0.0s
 => => transferring context: 2B                                                                                            0.0s
 => [internal] load metadata for docker.io/library/alpine:3.7                                                              0.8s
 => [internal] load build context                                                                                          0.0s
 => => transferring context: 12.52kB                                                                                       0.0s
 => CACHED [1/2] FROM docker.io/library/alpine:3.7@sha256:8421d9a84432575381bfabd248f1eb56f3aa21d9d7cd2511583c68c9b7511d10 0.0s
 => [2/2] COPY [ ./*, /foo/bar/ ]                                                                                          0.1s
 => exporting to image                                                                                                     0.1s
 => => exporting layers                                                                                                    0.0s
 => => writing image sha256:81531080243eedcb443c7fe0c9e85df92515a6cf3f997c549414cae9bf6ca925                               0.0s
 => => naming to docker.io/library/foo:tmp                                                                                 0.0s
/ # ls -l /foo/bar/
total 4
-rw-r--r--    1 root     root            67 Mar 26 16:43 Dockerfile
-rw-r--r--    1 root     root             0 Mar 26 16:37 a
-rw-r--r--    1 root     root             0 Mar 26 16:37 b
-rw-r--r--    1 root     root             0 Mar 26 16:41 c
-rw-r--r--    1 root     root             0 Mar 26 16:41 d
/ #