【问题标题】:ADD failed: file not found in build context添加失败:在构建上下文中找不到文件
【发布时间】:2022-08-16 17:10:13
【问题描述】:

我目前在我的项目的根目录中。

我的目标是尝试使用命令在 docker 容器中运行我的前端(front.py)和我的后端(API.py)

 sudo docker-compose -f project/docker/docker-compose.yml up -d

不幸的是,当需要在 Dockerfile 中添加 ./requirements.txt / 时它会停止并且似乎找不到它。

enter Building api-service-track-1
Sending build context to Docker daemon  3.072kB
Step 1/5 : FROM python:3
 ---> a42e2a4f3833
Step 2/5 : ADD ./requirements.txt /
ADD failed: file not found in build context or excluded by .dockerignore: stat requirements.txt: file does not exist
ERROR: Service \'api-service-track-1\' failed to build : Build failed

requirements.txt 包含

Flask==1.1.2
Flask-SQLAlchemy
Flask-Bcrypt
bleach

这是我的 Dockerfile

FROM python:3
ADD ./requirements.txt /
RUN pip3 install -r requirements.txt
WORKDIR /mnt/app/
CMD [\"./run.sh\", \"./project/codeAPI/API.py\", \"./project/codeAPI/front.py\"]

编辑: @DavidMaze 这是我的 docker-compose.yml 的代码

version: \'3\'

services:
  api-service-track-1:
    build:
      context: ./
      dockerfile: ./Dockerfile
    image: img_track1
    volumes:
      - ./:/mnt/app
    ports:
      - 5551:5551

编辑2: 这是我尝试启动 docker 后遇到的错误。

Starting docker_api-service-track-1_1 ... error

ERROR: for docker_api-service-track-1_1  Cannot start service api-service-track-1: failed to create shim: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: \"./run.sh\": stat ./run.sh: no such file or directory: unknown

ERROR: for api-service-track-1  Cannot start service api-service-track-1: failed to create shim: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: \"./run.sh\": stat ./run.sh: no such file or directory: unknown
ERROR: Encountered errors while bringing up the project.

这是否意味着我还需要更改我的 run.sh 目录?

编辑3: 运行.sh

#!/bin/bash

export PYTHONPATH=$PWD/project/
echo python path is:
echo $PYTHONPATH

echo running the following python program
echo $@
python3 \"$1\"
python3 \"$2\"
  • docker-compose.yml 文件中有什么内容?特别是,您将哪个目录传递为build:build: { context: } 目录?您能否将与 Docker 相关的工件移至存储库的顶层?
  • 请编辑问题以在其中包含格式正确的 YAML。但是,如果您指定context: .,则它与docker-compose.yml 文件的位置相关,您将无法在目录层次结构中更高级别的任何文件中指定COPY
  • 抱歉,我不经常使用 StackOverFlow。我刚刚添加了编辑。

标签: docker docker-compose


【解决方案1】:

问题的根本原因

您的上下文(作为目录)不包括添加的文件。这是主要问题。

细节

有 3 条相互关联的黄金法则:

  1. 语境路径相对于docker-compose.yaml 的位置
  2. ADD (or COPY`) 第一个参数是相对于该参数的路径语境
  3. ADD (or COPY`)第一个参数是路径必须在上下文文件夹内(无论是直接还是在上下文的子目录中)

    让我们应用这 3 条规则:

    1. 你的docker-compose.yaml./project/docker 里面,你的上下文是./

      => 你的上下文是./project/docker

    2. ADD ./requirements.txt ... & 上下文./project/docker

      => 表示您的requirements.txt 路径是./project/docker/requirements.txt 这是错误的,因为它存在于../../requirements.txt相对地上下文 (./project/docker)

      现在假设您通过放置 requirements.txt 的正确路径来解决问题:

      ADD ../../requirements.txt . 
      
      1. 最后的修复将不起作用,因为即使我们放置了那个 ADDed 文件的相对路径,该文件不在上下文中.

      解决方案

      • 语境必须更改为包括所有复制/添加的文件。
      • 复制/添加的文件路径必须保持相对于新的语境.

      项目/码头工人/码头工人-compose.yaml

      services:
        api-service-track-1:
          build:
            context: ../../ # context must include `requirements.txt`
            dockerfile: ./project/docker/Dockerfile # must be relative to context
      

      项目/码头工人/Dockerfile

      # ./ is Relative to the context
      ADD ./requirements.txt ...
      

【讨论】:

  • 喜欢。小心
【解决方案2】:

Dockerfile 的上下文是相对于 Dockerfile 的当前工作目录的。

您可以尝试将requirements.txt 移动到./projects/docker 子目录吗?或将 Dockerfile 中的 ADD 命令更改为 ADD ../../requirements.txt /

【讨论】:

  • 我不想更改当前的设置,因为我正在关注我的学校笔记。我刚刚将 requirements.txt 添加到 docker 目录中,我不再有错误。不幸的是,如果您能提供帮助,我会在帖子中添加另一个错误。
  • run.sh 在哪里?我看不到它已复制到 docker 映像?
  • run.sh 位于项目的根目录。我还将它添加到编辑中。
  • 我要问的是 run.sh 是否真的被复制到图像中......您可以通过注释掉 dockerfile 中的 CMD 行来检查它,重建图像,然后运行docker run -it <image-id> /bin/bash(显然替换 image-id使用实际的图像 ID),然后在容器中导航并查看那里的文件...
  • 即兴发挥,大概是这样的: 1. 修改 Dockerfile 并注释掉 CMD 行; 2.docker build -t xyz <path-to-dockerfile>; 3.docker run -it xyz /bin/bash。这将在容器中启动一个 bash 提示,您将能够看到那里有什么......
【解决方案3】:

如果要将当前目录(从运行命令的位置)保留为相对路径,则使用标志 -f 和“。”给出 Dockerfile 的文件路径。将代表上下文。

码头工人建造。 -f 项目/docker/Dockerfile

【讨论】:

    猜你喜欢
    • 2022-06-30
    • 2021-12-19
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多