簡體   English   中英

在dockerfile上使用COPY進行apache構建

[英]Using COPY on dockerfile for apache build

我是docker的新手,我正在嘗試為apache構建一個小型的dockefile,僅用於測試。

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  

我做錯了什么?

您添加或復制到docker鏡像的文件需要存在於您的構建目錄中。 如果你運行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

請注意,如果您使用docker for Windows或Mac,這些主機目錄需要與Docker VM共享一個目錄,默認情況下包含/ Users文件夾。

了解您不想安裝卷,而是希望將這些文件作為映像的一部分,以便可以共享它。 至少假設這一點。

根據Docker文檔

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

你現在可能會遇到這個問題。 在你的DockerfileCOPY語句是問題,因為它指的是絕對路徑,它不遵循上面的第一條規則。 因此, 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' 的Container中運行Image上方並復制並顯示其內容。 在你的情況下,它是htdocs

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM