添加失败:在构建上下文中找不到文件

Nas*_*dhi 5 docker docker-compose

我目前处于项目的根目录中。

在此输入图像描述

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

 sudo docker-compose -f project/docker/docker-compose.yml up -d
Run Code Online (Sandbox Code Playgroud)

不幸的是,当需要在 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
Run Code Online (Sandbox Code Playgroud)

requirements.txt 包含

Flask==1.1.2
Flask-SQLAlchemy
Flask-Bcrypt
bleach
Run Code Online (Sandbox Code Playgroud)

这是我的 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"]
Run Code Online (Sandbox Code Playgroud)

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

version: '3'

services:
  api-service-track-1:
    build:
      context: ./
      dockerfile: ./Dockerfile
    image: img_track1
    volumes:
      - ./:/mnt/app
    ports:
      - 5551:5551
Run Code Online (Sandbox Code Playgroud)

编辑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 Code Online (Sandbox Code Playgroud)

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

编辑3:run.sh

#!/bin/bash

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

echo running the following python program
echo $@
python3 "$1"
python3 "$2"
Run Code Online (Sandbox Code Playgroud)

Abd*_*UMI 8

问题的根本原因

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

细节

有 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

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

ADD ../../requirements.txt . 
Run Code Online (Sandbox Code Playgroud)
  1. 最后一个修复将不起作用,因为即使我们放置该 ADDed 文件的相对路径,该文件也不在 context 内

解决方案

  • 必须更改上下文以包含所有已复制/添加的文件
  • 复制/添加的文件路径必须保持相对于新上下文

项目/docker/docker-compose.yaml

services:
  api-service-track-1:
    build:
      context: ../../ # context must include `requirements.txt`
      dockerfile: ./project/docker/Dockerfile # must be relative to context
Run Code Online (Sandbox Code Playgroud)

项目/docker/Dockerfile

# ./ is Relative to the context
ADD ./requirements.txt ...
Run Code Online (Sandbox Code Playgroud)