为什么我无法将文件复制到Docker容器中?

8

我想把文件移动到一个Apache镜像的htdocs文件夹中。 这是我的dockerfile:

FROM httpd:2.4
MAINTAINER Ankit
COPY ./public-html/ /usr/local/apache2/htdocs/

但是COPY命令没有将文件复制到容器中。 以下是输出 - index.html是默认存在的,我正在尝试复制public-html文件夹:
root@8453b6ffa6fd:/usr/local/apache2/htdocs# ls
index.html

我有什么遗漏吗?

更新: public-html文件夹没有被复制,但是index.html文件已经被复制到那里了,这种行为的原因是什么?

更新2:这是我的最新dockerfile,以及构建和运行容器的命令。

Dockerfile:
FROM httpd:2.4
MAINTAINER Ankit
COPY public-html/ /usr/local/apache2/htdocs/public-html/

docker build -f Dockerfile -t apache .
docker run -d --name apws -v /Users/ankitsahu/workspace/docker_practi
ce/public-html:/usr/local/apache2/htdocs/ -p 80:80 apache

当我使用exec命令检查内容时:

root@b54e53a231b7:/usr/local/apache2/htdocs# ls -a
.  ..  index.html  sample.html  try
2个回答

5
如果你想将目录public-html复制到目录/usr/local/apache2/htdocs下,以便拥有一个.../htdocs/public-html/目录,则请使用以下命令:
COPY public-html/ /usr/local/apache2/htdocs/public-html/

默认情况下,复制一个目录将复制该目录的内容,因此您需要在目标中命名它以使该目录出现。


编辑:您的运行命令包含一个卷,将替换此目录的图像内容:

docker run -d --name apws -v /Users/ankitsahu/workspace/docker_practice/public-html:/usr/local/apache2/htdocs/ -p 80:80 apache

如果你想查看图像中的内容,请勿使用音量:

docker run -d --name apws -p 80:80 apache

如果你想使用卷,则需要修改位于docker主机上的/Users/ankitsahu/workspace/docker_practice/public-html的内容。

即使这样也没有将public-html文件夹复制到容器中。 - Ankit Sahu
请包括您构建新镜像和运行容器的步骤。 - BMitch
Dockerfile: FROM httpd:2.4 MAINTAINER Ankit COPY public-html/ /usr/local/apache2/htdocs/public-html/docker build -f Dockerfile -t apache . docker run -d --name apws -v /Users/ankitsahu/workspace/docker_practice/public-html:/usr/local/apache2/htdocs/ -p 80:80 apache当我使用exec命令检查内容时: root@b54e53a231b7:/usr/local/apache2/htdocs# ls -a . .. index.html sample.html try - Ankit Sahu
请查看我的问题中的UPDATE2以获取格式正确的响应。 - Ankit Sahu
我使用-v选项,这样每次修改代码时就不必重新构建镜像。-v选项帮助我在主机浏览器中立即查看我所做的项目更改(存在于主机中)。请问您最后一句话想传达什么意思? - Ankit Sahu

0

在将文件 COPY 到根目录以外的其他目录之前,您必须先创建这些目录。

请将您的 Dockerfile 更新为以下内容:

FROM httpd:2.4 MAINTAINER Ankit 
MKDIR -p /usr/local/apache2/htdocs/ # Create the directory with '-p' option. 
COPY ./public-html/ /usr/local/apache2/htdocs/

编辑1

根据Docker CP Command文档,如果:

DEST_PATH存在且是一个目录,并且

SRC_PATH不以/结尾(即:斜杠后跟着点),则 源目录将被复制到该目录中

SRC_PATH以/结尾(即:斜杠后跟着点),则 源目录的内容将被复制到该目录中

在您的情况下,/public-html/以斜杠结尾,因此只有内容会被复制。将其更新为./public-html应该可以解决问题。

希望这可以帮助您。


htdocs文件夹已经存在,但public-html文件夹并未在htdocs内创建。 - Ankit Sahu
啊!我误读了问题。请将COPY修改为COPY public-html /usr/local/apache2/htdocs/ - krisnik
不行,那也不起作用。+ ./public-html/是必需的,因为它提到了从我的项目根目录开始的相对路径。 - Ankit Sahu
不应该是这样的。你的“public-html”文件夹里还有其他没有被复制的文件吗? - krisnik
我之前说子文件夹没有被复制,这是错误的。我刚刚重新检查了一下,子文件夹确实被复制了,但主文件夹即public-html文件夹并没有被复制到htdocs中。 - Ankit Sahu
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接