在dockerfile上为apache构build使用COPY

我是新来的docker工人,我正在试图build立一个小的dockofile的Apache只是为了testing。

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 

我做错了什么?

了解你不想安装卷,而是想要这些文件的一部分,以便它可以共享。 至less假设这一点。

根据Docker文档

COPY遵守以下规则:
– path必须位于构build的上下文中; 你不能COPY ../something / something,因为docker build的第一步是将上下文目录(和子目录)发送到docker守护进程。
– 如果是目录,则复制目录的全部内容,包括文件系统元数据。

现在你可能会遇到这个问题。 在你的DockerfileCOPY语句是个问题,因为它指的是不遵循上述第一条规则的绝对path。 所以, htdocs应该在您执行docker build命令的本地目录中可用。

在构build图像之前需要进行以下更改:

  • 希望您可能已经创build了一个目录(您正在构build映像),并且此目录包含Dockerfilehttpd-custom.conf文件。
  • 现在进入上面的目录,将/opt/mw/apache-2.2.31-instance1/htdocs复制到当前目录。 所以, htdocs目录现在可以在创build图像时成为上下文的一部分(如文档中所述)。
  • 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 

现在你应该可以成功地build立它。

只是演示,使用一个轻量级的busybox并在同一个上下文中创build一个目录(模拟你的情况),它的确如你所见:

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

构build图像:

 $ 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 

您添加或复制到泊坞窗镜像中的文件需要存在于您的构build目录中。 如果你运行docker build -t myimage . 那么. 是你的build立目录。 docker build打包构build目录中的所有文件,排除.dockerignore中列出的任何文件,将其上传到您连接的泊坞窗主机(可能是远程服务器)。

如果你只是想让htdocs在正在运行的容器中可以访问的话,那么在docker run ,我会把主机目录绑定到一个容器中。 例如, docker run -v /opt/mw/apache-2.2.31-instance1/htdocs/:/usr/local/apache2/htdocs/:ro yourimagename 。 事实上,如果你的Dockerfile只有这些行,你可以完全跳过构build并运行:

 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文件夹。