2017-03-03 111 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