2016-10-29 78 views
2

我是docker的新手,我正在嘗試爲apache構建一個小型dockefile來進行測試。在dockerfile上爲apache構建使用COPY

FROM httpd:2.2.31 

RUN mkdir -p /opt/mw/apache-test/logs 

ADD ./httpd-custom.conf /usr/local/apache2/conf/httpd.conf 
COPY /opt/mw/apache-2.2.31-instance1/htdocs/ /usr/local/apache2/htdocs/ 

但由於某種原因我得到一個COPY錯誤。 另外,我嘗試使用ADD。
這是我得到的錯誤:

Step 4 : COPY /opt/mw/apache-2.2.31-instance1/htdocs/ /usr/local/apache2/htdocs/ 
lstat opt/mw/apache-2.2.31-instance1/htdocs/: no such file or directory 

我做錯了嗎?

+0

是您的主機上/opt/mw/apache-2.2.31-instance1/htdocs/存在的目錄? – harrybvp

+1

更重要的是,該目錄是否存在於作爲構建圖像的上下文傳遞的路徑中?另外,儘量不要混合ADD和COPY,Docker建議使用COPY。並刪除源文件夾的尾部斜線 – R0MANARMY

+0

對於第一個問題,是的目錄存在。它是我一直用來測試的。 對於第二個問題。我想它存在,我正在使用Apache映像。 https://hub.docker.com/_/httpd/ – radicaled

回答

2

明白,你不想裝入卷,而是希望有這樣它可以共享圖像的這些文件的一部分。至少假設這一點。

作爲每Docker documentation

COPY遵循以下規則:
- 路徑必須是構建的上下文內;你不能COPY ../something/something,因爲docker build的第一步是將上下文目錄(和子目錄)發送到docker守護進程。
- 如果是目錄,則複製該目錄的全部內容,包括文件系統元數據。

您現在可能得到了這個問題。在你的Dockerfile即,COPY聲明是問題,因爲它是指絕對路徑不符合上述第一條規則。因此,htdocs應在您執行docker build命令的本地目錄中可用。需要構建圖像之前取得

以下變化:

  • 希望您可能已經創建了一個目錄(你正在構建圖像)和該目錄包含Dockerfilehttpd-custom.conf文件。
  • 現在,進入上述目錄並將/opt/mw/apache-2.2.31-instance1/htdocs複製到當前目錄。因此,htdocs目錄現在可以在構建映像時成爲上下文的一部分(如文檔中所述)。
  • 變化Dockerfile以下(主要是COPY命令)內容:
FROM httpd:2.2.31 

RUN mkdir -p /opt/mw/apache-test/logs 

ADD ./httpd-custom.conf /usr/local/apache2/conf/httpd.conf 
COPY htdocs /usr/local/apache2/htdocs 

現在,你應該能夠成功地建立它。

對於剛剛演示中,使用了重量輕busybox創造在同一背景下的目錄(模擬你的情況下),它的確如你看到下面:

$ more Dockerfile 
FROM busybox 
COPY data_folder /opt/data_folder 
CMD ["ls", "/opt/data_folder"] 

$ ls 
data_folder Dockerfile 
$ ls data_folder/ 
test.txt 

製作圖片:

$ sudo docker build -t dirtest . 
Sending build context to Docker daemon 3.584 kB 
Step 1 : FROM busybox 
---> e02e811dd08f 
Step 2 : COPY data_folder /opt/data_folder 
---> b6b1a9555825 
Removing intermediate container b682e0467803 
Step 3 : CMD ls /opt/data_folder 
---> Running in 3b05f08ceafc 
---> b73190fc1fd9 
Removing intermediate container 3b05f08ceafc 
Successfully built b73190fc1fd9 

在容器的圖片上方運行,顯示目錄'data_folder'被複制並顯示其內容。在你的情況下,htdocs

$ sudo docker run -it --rm --name testdirtest dirtest 
test.txt 
2

文件添加或複製到一個碼頭工人形象需要你的build目錄中存在。如果您運行的是docker build -t myimage .,那麼.就是您的構建目錄。 docker build打包構建目錄中的所有文件,排除.dockerignore中列出的任何文件,並將其上載到您連接到的docker主機(它可能是遠程服務器)。

如果您只是希望在正在運行的容器中可以訪問htdoc,那麼在docker run期間,我會將主機目錄作爲卷綁定到容器中。例如,docker run -v /opt/mw/apache-2.2.31-instance1/htdocs/:/usr/local/apache2/htdocs/:ro yourimagename。事實上,如果你Dockerfile只有那些行,你完全可以跳過構建和運行:

docker run \ 
    -v `pwd`/httpd-custom.conf:/usr/local/apache2/conf/httpd.conf:ro \ 
    -v /opt/mw/apache-2.2.31-instance1/htdocs/:/usr/local/apache2/htdocs/:ro \ 
    -v `pwd`/logs:/opt/mw/apache-test/logs \ 
    httpd:2.2.31 

請注意,如果您使用的是Windows或Mac泊塢窗,這些主機目錄,需要在一個共享目錄與默認情況下包含/ Users文件夾的Docker虛擬機。

+0

實際上,這工作,但我想建立一個使用dockerfile進行測試的圖像 – radicaled

+0

要構建圖像,然後只需按照我的第一段中的說明,移動/ opt/mw/...到您的編譯目錄中。 – BMitch

相關問題