Docker COPY 关于符号链接的规则是什么/如何保留符号链接?
What are Docker COPY's rules about symlinks / how can I preserve symlinks?
从这个试验来看,Docker 的 COPY
命令似乎没有保留符号链接——相反,它“跟随”符号链接并复制目标文件(?):
$ 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
/ #
无论我是从我的上下文还是从另一个 Docker 图像层复制,这种行为似乎都是一样的。
有什么方法可以让我获得 Docker 副本以保留符号链接,而不是“跟随”它们并创建硬文件?或者是否有一些惯例可以解决这种情况?
这个问题背后的背景是,我从中复制的基础层有(很多)混合的文件和指向它们的符号链接。示例:libfoo.so -> libfoo.so.1 -> libfoo.so.1.0.0
我花了一段时间在网上搜索这个主题,但结果出乎意料的少。大多数“关闭”问题都是关于目录的符号链接,这与我的情况不同。我得到的最接近的结果是这个不幸的未回答的问题:https://forums.docker.com/t/copying-symlinks-into-image/39521
如果您尝试将整个目录作为一个单元复制,而不是尝试复制目录中的文件,则此方法有效:
COPY ./ /foo/bar/
请注意,复制目录有一些微妙之处:Dockerfile COPY
documentation 指出,如果您 COPY
一个目录,
NOTE: The directory itself is not copied, just its contents.
这对于您尝试复制整个构建上下文的情况来说很好。如果您有要复制的子目录,则需要确保子目录名称也在 COPY
的右侧,并且目录名称以 /
.[=17 结尾=]
从这个试验来看,Docker 的 COPY
命令似乎没有保留符号链接——相反,它“跟随”符号链接并复制目标文件(?):
$ 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
/ #
无论我是从我的上下文还是从另一个 Docker 图像层复制,这种行为似乎都是一样的。
有什么方法可以让我获得 Docker 副本以保留符号链接,而不是“跟随”它们并创建硬文件?或者是否有一些惯例可以解决这种情况?
这个问题背后的背景是,我从中复制的基础层有(很多)混合的文件和指向它们的符号链接。示例:libfoo.so -> libfoo.so.1 -> libfoo.so.1.0.0
我花了一段时间在网上搜索这个主题,但结果出乎意料的少。大多数“关闭”问题都是关于目录的符号链接,这与我的情况不同。我得到的最接近的结果是这个不幸的未回答的问题:https://forums.docker.com/t/copying-symlinks-into-image/39521
如果您尝试将整个目录作为一个单元复制,而不是尝试复制目录中的文件,则此方法有效:
COPY ./ /foo/bar/
请注意,复制目录有一些微妙之处:Dockerfile COPY
documentation 指出,如果您 COPY
一个目录,
NOTE: The directory itself is not copied, just its contents.
这对于您尝试复制整个构建上下文的情况来说很好。如果您有要复制的子目录,则需要确保子目录名称也在 COPY
的右侧,并且目录名称以 /
.[=17 结尾=]