2017-03-03 46 views
2

我正在Dockerizing一个应用程序,它涉及通过Clang将二进制文件与其他C文件链接起来。我们保留了二进制文件的符号链接版本,因为它们在整个代码库中都被使用。我的Docker构建目录包含这整个代码库(包括源文件以及这些源文件的符号链接),当我执行诸如cat [symlinked_file](即正确编辑文件为cat)时,Docker会识别这些文件。然而,当我在我的Makefile中运行我的Clang命令时,它无法链接符号链接的文件(这些工作很好,不在Docker中)。然后,我将原始文件复制到符号链接所在的目录中,替换符号链接,并且Docker在构建时不会发生任何错误。Docker不会遵循构建目录中的符号链接

有谁知道如何解决这个问题?我需要在这里给Docker或Clang一些特殊的命令吗?我不知道为什么Clang在Docker容器内的行为不同于外部。我从Ubuntu 16.04基础映像运行以供参考。

+0

当时构建上下文目录中的符号链接_target_,或在文件系统上的另一个文件夹? – BMitch

+0

是的。 Dockerfile所在的顶层目录'dir'包含子目录'dir1'和'dir2'。符号链接的文件以及目标位于'dir1'中。我发现了关于构建上下文以外的文件的其他问题,并且我可以理解Docker在这种情况下会失败的原因,但是当所有必要的文件都存在于构建上下文中时,它会让我困惑为什么失败。 –

回答

2

Docker将使用符号链接(至少在我的linux主机上构建时),但符号链接目标需要位于构建上下文中。联系上下文发送到泊坞窗引擎和容器内的服务器上进行构建,因此任何链接文件上下文之外不会解决:

$ 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 
+0

有意义,但我所有的目标都在构建上下文:( –

1

我最近所面对的确切同样的问题。大量的研究和测试后,这里就是我从泊坞小组发现...

https://github.com/docker/docker/issues/1676

是的,我们选择不跟随符号连接的泊坞窗构建因为 的结果不一致,可能发生在不同的 系统上。

基本上,这不是一个功能即将到来。

这是我的文件夹结构。两个版本库位于相同的目录级别。

/cms-code 
/cms-themes 

我想符号链接/public文件夹内/cms-code/cms-themes文件夹。并在/cms-code内建立一个Dockerfile COPY或将公用文件夹添加到图像中。不幸的是,我得到的只是一个复制到图像/容器中的符号链接,但没有任何内容。

的选项,因为我看到他们:

  1. 都 库后创建一个bash/sh脚本,将文件复制到公共的设置。 [不利于活跃的开发或基于文件的更改 刷新]
  2. 使用Git的子模块系统,以我的 cms-themes回购搬进/cms-code 库的/public文件夹。 [对我的特殊情况不适用]
  3. 使用docker-compose可以将/public文件夹设置为/cms-code以与我的主机/cms-themes目录同步。 [这是我最终选择的 。这仍然不理想,但它确实有效。CMS容器 (一次运行)看到/public的所有内容,其实际上是中的文件。

希望这会有所帮助,并与您的情况有关。如果您有任何问题,请告诉我。如果您不熟悉撰写的卷,我可以共享样本docker-compose.yml文件。

更新 - 添加撰写文件引用的要点是: https://gist.github.com/sgelliott/191c681ebb261c6a36ecd5fb70eb0176

+0

如果你可以共享一个'docker-compose.yml'文件,这将是超级有用的! –

+1

@AadilBhatti - 当然......我更新了我的答案希望有帮助,如果你有更多问题,请告诉我。 – sgelliott