2015-01-21 126 views
11

所有,我試圖從我的主機持久複製文件到一個圖像,以便這些文件可用於基於該圖像啓動的每個容器。在debian wheezy 64bit上作爲virtualbox guest運行。Dockerfile COPY指令失敗?

的Dockerfile相當簡單(安裝八度圖像):

FROM debian:jessie 
MAINTAINER GG_Python <[redacted]@gmail.com> 
RUN apt-get update 
RUN apt-get update 
RUN apt-get install -y octave octave-image octave-missing-functions octave-nan octave-statistics 

RUN mkdir /octave 
RUN mkdir /octave/libs 
RUN mkdir /octave/libs/jsonlab 
COPY ~/octave/jsonlab/loadjson.m /octave/libs/jsonlab/. 

我發出編譯命令後得到以下跟蹤:docker build -t octave .

Sending build context to Docker daemon 423.9 kB 
Sending build context to Docker daemon 
Step 0 : FROM debian:jessie 
---> 58052b122b60 
Step 1 : MAINTAINER GG_Python <[..]@gmail.com> 
---> Using cache 
---> 90d2dd2f7ee8 
Step 2 : RUN apt-get update 
---> Using cache 
---> 4c72c25cd829 
Step 3 : RUN apt-get update 
---> Using cache 
---> b52f0bcb9f86 
Step 4 : RUN apt-get install -y octave octave-image octave-missing-functions octave-nan octave-statistics 
---> Using cache 
---> f0637ab96d5e 
Step 5 : RUN mkdir /octave 
---> Using cache 
---> a2d278b2819b 
Step 6 : RUN mkdir /octave/libs 
---> Using cache 
---> 65efbbe01c99 
Step 7 : RUN mkdir /octave/libs/jsonlab 
---> Using cache 
---> e41b80901266 
Step 8 : COPY ~/octave/jsonlab/loadjson.m /octave/libs/jsonlab/. 
INFO[0000] ~/octave/jsonlab/loadjson.m: no such file or directory 

泊塢窗決不肯將複製此文件從主機到圖像。不用說loadjson.m文件在那裏(貓顯示),我所有的嘗試改變路徑(相對,絕對等)失敗。任何意見爲什麼這個簡單的任務是有問題的?

+0

使用mkdir您可以使用-p選項一氣呵成創建它們的所有目錄:mkdir -p /倍頻程/庫/ jsonlab – dalore 2017-12-21 11:32:48

+0

,也是第3行應結合進入一個RUN – dalore 2017-12-21 11:33:22

回答

11

Docker不會擴展〜或$ HOME。您可能需要顯式引用該文件,或者將其與Dockerfile本身相關進行打包。

+0

作品!我已經將文件複製到Dockerfile所在的目錄中,並且注意目標文件夾(必須有反斜槓,但「/。」作爲目標文件失敗)。 Docker似乎對這個操作非常挑剔.. – 2015-01-21 01:08:35

+1

奇怪的是,使用源文件的顯式路徑對我來說不起作用 - 即使它與Dockerfile位於相同的位置。我刪除了源文件的路徑,它工作。 – ben 2016-07-28 11:12:48

8

Docker只能從上下文中複製文件,您所在的文件夾中沒有列出dockerignore文件中的任何文件。

當您運行'docker build'docker tars context時,它會將它發送到您連接的docker守護進程。它只允許您在上下文中複製文件,因爲該守護程序可能是遠程計算機。

+3

這是我的情況,我正在研究一箇舊項目,我意識到我在'.dockerignore'中有一個「*」規則,非常感謝 – gsalgadotoledo 2017-05-03 14:57:15

3

我不能讓COPY工作,直到我理解上下文(我試圖將文件從上下文之外複製)

泊塢窗構建命令構建從Dockerfile和上下文的圖像。構建的上下文是指定位置PATH處的文件。 PATH是本地文件系統上的一個目錄。

遞歸處理上下文。所以,一個PATH包含任何子目錄。

構建由Docker守護進程運行,而不是通過CLI運行。構建過程所做的第一件事是將整個上下文(遞歸地)發送到守護進程。在大多數情況下,最好以空目錄作爲上下文開始,並將Dockerfile保存在該目錄中。僅添加構建Dockerfile所需的文件。

警告:不要使用根目錄/作爲PATH,因爲它會導致構建將硬盤的整個內容傳輸到Docker守護進程。

參考: https://docs.docker.com/engine/reference/builder/#usage