在dockerfile上使用COPY进行apache构建

时间:2016-10-29 00:54:38

标签: docker centos dockerfile

我是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  

我做错了什么?

2 个答案:

答案 0 :(得分:2)

您添加或复制到docker镜像的文件需要存在于您的构建目录中。如果您运行docker build -t myimage .,则.是您的构建目录。 docker build打包构建目录中的所有文件(不包括.dockerignore中列出的任何文件),将它们上传到您连接的docker主机(可能是远程服务器)。

如果您只是想在正在运行的容器中访问htdocs,那么我会在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文件夹。

答案 1 :(得分: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