运行Docker镜像时出现“没有此文件或目录”错误

15
我正在学习Docker的概念,并尝试制作我的项目的Docker镜像。我已经安装了Windows版的Docker桌面应用程序,并通过以下命令成功构建了镜像:
docker build -t ${IMAGE_NAME} .

但是,当我运行以下命令docker run ${IMAGE_NAME}:${TAG}时,我遇到了以下文件未找到的错误:

D:\Projects\AI360\deep_auto_backbar_api>docker run dsbyprateekg:prateek_gupta python3: can't open file '/Prepare_Dataset/server_engine/server.py': [Errno 2] No such file or directory

我的项目结构如下:

enter image description here

我的Dockerfile.txt有以下指令:
FROM python: 3.6-stretch
MAINTAINER PrateekG

# install build utilities
RUN apt-get update && \
    apt-get install -y gcc make apt-transport-https ca-certificates build-essential

# check our python environment
RUN python3 version RUN pip3 --version

# Installing python dependencies
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Copy all the files from the project's root to the working directory 
COPY Prepare_Dataset/ .

# Running Python Application
CMD ["python3", "/Prepare_Dataset/server_engine/server.py"]

我怀疑我在文件路径方面遗漏了一些东西。请看看我的Dockerfile和项目结构,帮助我找出我在这里做错了什么。


请避免使用外部图片,尽量使用文字而非截图。请查看我所做的修改:https://stackoverflow.com/posts/59497389/revisions - Paolo
4个回答

12
在我的情况下,我必须将行分隔符从 CR/LF (Windows)更改为 LF (Unix/Linux/macOS)。要在IntelliJ中执行此操作,您必须在项目窗口中选择根文件夹,然后转到 文件 - > 文件属性 - > 行分隔符 - > LF-Unix and macOS (\n)
另请参见这个答案

要关闭此自动转换功能,请访问以下链接:https://gist.github.com/NateWeiler/df202280ce8cc38e9f00dbc17708fab2 - undefined

7
当您使用COPY Prepare_Dataset/ .时,它将复制目录的内容,而不是目录本身,因此CMD路径会变为无效的/Prepare_Dataset/server_engine/server.py
您需要使用:
COPY Prepare_Dataset/ ./Prepare_Dataset/

因此,在复制时您可以进行验证。

Step 5/7 : COPY Prepare_Dataset/ ./Prepare_Dataset/
 ---> Using cache
 ---> 2c5c15c23f65
Step 6/7 : RUN ls | grep "Prepare_Dataset"
 ---> Running in 54147bd4740c
Prepare_Dataset

最好保持一致性以避免未来出现此类错误。
# SEt workdirectory
WORKDIR /app
# Now it will copy to /app/
COPY Prepare_Dataset/ ./Prepare_Dataset
CMD ["Prepare_Dataset/server_engine/server.py"]

您可以按照以下步骤验证您的问题。
COPY Prepare_Dataset/ .
#You will see the content but not the directory
RUN ls /

你将无法看到该目录,但可以在其中grep任何文件。

Step 5/7 : COPY Prepare_Dataset/ .
 ---> Using cache
 ---> e4eec046c860
Step 6/7 : RUN ls | grep "Prepare_Dataset"
 ---> Running in 23e4b2aab3d1
The command '/bin/sh -c ls | grep "Prepare_Dataset"' returned a non-zero code: 1

0
如果其他人遇到了这个问题,我也遇到了同样的错误。但是我的问题是不同的:
# Error `No such file or directory`

ENTRYPOINT ["/bin/bash", "-c", "{$APP}"]

# Success

ENTRYPOINT ["/bin/bash", "-c", "$APP"]

0

确保TAG的值正确。使用以下命令检查容器是否正在启动;

docker ps -a

使用ENTRYPOINT而不是CMD,然后您可以在docker run中像您的示例一样使用命令行选项。
ENTRYPOINT ["python3", "Prepare_Dataset/server_engine/server.py"]

参考资料:链接


我已经验证了,TAG值是正确的并且已经启动。使用ENTRYPOINT而不是CMD没有任何改变。我仍然得到相同的错误。 - ebsavvy

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