我是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
我做错了什么?
答案 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)
了解您不想安装卷,而是希望将这些文件作为映像的一部分,以便可以共享它。至少假设这一点。
COPY遵守以下规则:
- 路径必须位于构建的上下文中;你不能COPY ../something / something,因为docker build的第一步是将上下文目录(和子目录)发送到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'被复制并显示其内容。在您的情况下,它是htdocs
$ sudo docker run -it --rm --name testdirtest dirtest
test.txt