[英]Dockerfile COPY command is missing a single file when using `gcloud build`
[英]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守護進程。
- 如果是目錄,則復制目錄的全部內容,包括文件系統元數據。
你現在可能會遇到這個問題。 在你的Dockerfile
即COPY
語句是問題,因為它指的是絕對路徑,它不遵循上面的第一條規則。 因此, htdocs
應該在您執行docker build
命令的本地目錄中可用。
在構建映像之前需要進行以下更改:
Dockerfile
, httpd-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.