Docker. 没有这个文件或目录。

6
我有一些文件,想要将它们移到一个 Docker 容器中。 但最终 Docker 找不到文件。
本地机器上带有文件的文件夹位于/home/katalonne/flask4
如果有关系,这是文件结构: File Structure if it matters Dockerfile:
#
# First Flask App Dockerfile
#
#

# Pull base image.
FROM centos:7.0.1406

# Build commands
RUN yum install -y python-setuptools mysql-connector mysql-devel gcc python-devel
RUN easy_install pip
RUN mkdir /opt/flask4
WORKDIR /opt/flask4
ADD requirements.txt /opt/flask4
RUN pip install -r requirements.txt
ADD . /opt/flask4

# Define deafult command.
CMD ["python","hello.py"]

# Expose ports.
EXPOSE 5000

所以我用这个命令构建了图像:

docker build -t flask4 .

我通过使用卷运行了容器:

docker run -d -p 5000:5000 -v /home/Katalonne/flask4:/opt/flask4 --name web flask4

当我想在容器上运行文件时:

docker logs -f web

我收到了一个错误提示,无法找到我的hello.py文件:
python: can't open file 'hello.py': [Errno 2] No such file or directory

我的问题出在哪里?

P.S.:我对Docker和Linux有一些陌生。

1个回答

6
位于Dockerfile所在位置的文件和目录确实在docker build期间是可用的(临时的)。但是,在docker build之后,除非您使用ADD或COPY将这些文件永久地移动到docker容器中,否则它们将不会在构建完成后对docker容器可用。这个文件上下文是为了构建,但您想要将它们移动到容器中。
您可以添加以下命令:
...
ADD . /opt/flask4
ADD . . 

# Define deafult command.
CMD ["python","hello.py"]

这行代码 ADD . . 应该会将临时构建环境中的所有内容复制到容器中。这些文件将会被复制到你的 WORKDIR 所指向的位置 (/opt/flask4)。

如果你只想将 hello.py 添加到容器中,那么可以使用

ADD hello.py hello.py

因此,当您运行CMD ["python","hello.py"]时,您将在/opt/flask4中,而hello.py应该在那里,在该目录中运行命令python hello.py应该可以正常工作。
希望对您有所帮助。

我快完成了,但是如何删除最后一个容器或更新容器?“docker run -d -p 5000:5000 -v /home/Katalonne/flask4:/opt/flask4 --name web flask4”? - Katallone
使用 docker rm web 命令来删除容器。使用 docker rmi flask4 命令来删除镜像。 - CtheGood
哦,不幸的是它给了我同样的错误... 它找不到文件 hello.py ... - Katallone
让我确认一下:您删除了旧容器和旧镜像,将ADD . .这一行添加到dockerfile中CMD的上方,运行了docker build .,它创建了一个新的镜像,您使用docker run -d -p 5000:5000 -v /home/Katalonne/flask4:/opt/flask4 --name web flask4基于该镜像创建了一个新的容器,并且仍然遇到了相同的错误?从您最后的评论中,我想确保我们在同一页上...我在本地进行了测试,它对我来说很好用。 - CtheGood
我在CMD上面加入了ADD . .,然后执行了以下命令:docker build -t flask4 .,最后运行了以下命令:docker run -d -p 5000:5000 -v /home/Katalonne/flask4:/opt/flask4 --name web flask4| 嘿,你有 Skype 或其他聊天工具吗?我想和你聊一下 Docker 的事情。 - Katallone
尝试运行 docker run -d -p 5000:5000 -v /home/Katalonne/flask4:/opt/flask4 --name web flask bash 命令,它会让你进入容器。然后,运行 ls 命令和 python hello.py。结果是什么?我没有Skype。 - CtheGood

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