在 dockerfile 上使用 COPY 进行 apache 构建

rad*_*led 5 centos docker dockerfile

我是 docker 的新手,我正在尝试为 apache 构建一个小的 docefile 仅用于测试。

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/
Run Code Online (Sandbox Code Playgroud)

但是由于某种原因,我在 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  
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

Rao*_*Rao 3

了解您不想挂载卷,而是希望将这些文件作为映像的一部分,以便可以共享。至少假设是这样。

根据Docker 文档

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

您现在可能已经遇到问题了。在您的Dockerfileie 中,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
Run Code Online (Sandbox Code Playgroud)

现在您应该能够成功构建它。

对于演示,使用轻量级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
Run Code Online (Sandbox Code Playgroud)

构建图像:

$ 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
Run Code Online (Sandbox Code Playgroud)

在容器中运行上面的图像,显​​示目录“data_folder”已被复制并显示其内容。在你的情况下,它是htdocs

$ sudo docker run -it --rm --name testdirtest dirtest
test.txt
Run Code Online (Sandbox Code Playgroud)