Docker不遵循构建目录中的符号链接

Aad*_*tti 2 c ubuntu symlink clang docker

我正在对一个应用程序进行Docker化,该应用程序涉及通过Clang将二进制文件与其他C文件链接。我们维护二进制文件的符号链接版本,因为它们已在整个代码库中使用。我的Docker构建目录包含整个代码库(包括源文件以及指向这些源文件的符号链接),而Docker在执行类似操作cat [symlinked_file](即cat正确编辑文件)时可以识别这些文件。但是,当我在Makefile中运行Clang命令时,它无法链接符号链接的文件(在Docker中无法正常工作)。然后,我将原件复制到符号链接所在的目录中,替换了符号链接,并且Docker在构建时未引发任何错误。

有谁知道如何解决这个问题?在这里,我需要向Docker或Clang提供任何特殊命令吗?我不确定为什么Clang在Docker容器中的行为与在其外部的行为不同。我正在从Ubuntu 16.04 Base Image运行以作参考。

BMi*_*tch 5

Docker将使用符号链接(至少在我的Linux主机上构建时),但是符号链接目标必须在构建上下文中。该上下文将发送到docker引擎,并且构建在容器内的该服务器上进行,因此指向该上下文外部文件的任何链接都将无法解析:

$ ls -al
total 8
drwxr-xr-x  2 bmitch bmitch 4096 Mar  2 21:08 .
drwxr-xr-x 13 bmitch bmitch 4096 Mar  2 21:07 ..
lrwxrwxrwx  1 bmitch bmitch   11 Mar  2 21:08 outside.txt -> ../test.out
lrwxrwxrwx  1 bmitch bmitch   10 Mar  2 21:08 source.txt -> target.txt
-rw-r--r--  1 bmitch bmitch    0 Mar  2 21:08 target.txt

$ cat Dockerfile
FROM busybox
COPY . /build-context
WORKDIR /build-context
CMD find .

$ docker build -t test-symlink .
Sending build context to Docker daemon 3.584 kB
Step 1/4 : FROM busybox
 ---> 7968321274dc
Step 2/4 : COPY . /build-context
 ---> 8238dac16669
Removing intermediate container dd653dfdf7a4
Step 3/4 : WORKDIR /build-context
 ---> c1850cb52f0e
Removing intermediate container 7ee87e20d525
Step 4/4 : CMD find .
 ---> Running in e710e965d98c
 ---> fd57eb8f426b
Removing intermediate container e710e965d98c
Successfully built fd57eb8f426b

$ docker run test-symlink
.
./outside.txt
./Dockerfile
./source.txt
./target.txt

$ docker run -it --rm test-symlink /bin/sh
/build-context # ls -al
total 12
drwxr-xr-x    2 root     root          4096 Mar  3 02:09 .
drwxr-xr-x   20 root     root          4096 Mar  3 02:09 ..
-rw-r--r--    1 root     root            69 Mar  3 02:08 Dockerfile
lrwxrwxrwx    1 root     root            11 Mar  3 02:08 outside.txt -> ../test.out
lrwxrwxrwx    1 root     root            10 Mar  3 02:08 source.txt -> target.txt
-rw-r--r--    1 root     root             0 Mar  3 02:08 target.txt
/build-context # cat outside.txt
cat: can't open 'outside.txt': No such file or directory
/build-context # cat target.txt
/build-context # exit
Run Code Online (Sandbox Code Playgroud)

  • 有道理,但我所有的目标都在构建上下文中:( (2认同)