什么是Docker Copy关于符号链接的规则 /我如何保留符号链接?

问题描述 投票:0回答:1

通过此试验,看起来像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副本来保留Symlinks,即“关注”它们并创建硬文件?还是有一些惯例可以解决这种情况?

这个问题背后的上下文是,我要复制的基础层具有(很多)指向它们的文件和符号链接的混合物。示例:

libfoo.so -> libfoo.so.1 -> libfoo.so.1.0.0


我花了一段时间在网上搜索此主题,但令人惊讶的是命中率很少。大多数“关闭”问题是关于目录的同一链接,这与我的情况不同。不幸的是,我获得的最接近的问题是未解决的问题:
https://forums.docker.com/t/copying-symlinks-into-image/39521

docker dockerfile copy symlink
1个回答
8
投票

COPY ./ /foo/bar/

注意复制目录周围有一些微妙之处:
dockerfile

COPY文档

指出,如果您是目录,
注:目录本身并未复制,而只是其内容。

对于您试图复制整个构建上下文的情况,这很好。 如果您要尝试复制一个子目录,则需要确保子目录名称也位于
COPY

的右侧,并且目录名称以

COPY
.

的结尾。

该问题的最后一段暗示复制特定的C共享库。  如果您处于这种情况下,您真的不想将所有内容复制到目标图像中,尤其是如果它是最小的“分心”图像。
在这种情况下,您可以在基本图像中创建一个临时目录,并使用Linux
/

选项复制在此处的文件来保留符号链接。 然后,您可以将该目录放在目标图像中。
/usr/lib

	

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.