Home > Enterprise >  Why my docker-compose build is failing when copying files
Why my docker-compose build is failing when copying files

Time:07-23

I have a project that is running just fine using fastAPI (main.py). Now I want to share it as a docker image. Here is what I am doing:

My project has this structure:

project
│  docker-compose.yaml 
|  requirements.txt  
│
└───<dir>services   
   │
   └───<dir>api
   |      │   Dockerfile
   |      │   main.py
   |      |
   |       <dir>model
   |          file.model
   |          file.model
   └───<dir>statspy  
            file.dev.toml
            file.prod.toml

My Dockerfile:

FROM python:3.10

RUN pip install fastapi uvicorn transformers

COPY . /api /api/api

ENV PYTHONPATH=/api
WORKDIR /api

EXPOSE 8000

ENTRYPOINT ["uvicorn"]
CMD ["api.main:app", "--host", "0.0.0.0"]

docker_compose.yaml

version: "3"

services:
  docker_model:
    build: ./services/api
    ports:
      - 8000:8000
    labels:
      - "statspy.enable=true"
      - "statspy.http.routers.fastapi.rule=Host(`fastapi.localhost`)"

  topic_v5:
    image: statspy:v5.0
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "$PWD/services/statspy/statspy.dev.toml:/etc/statspy/statpys.toml"

when I run docker-compose build it fails with this error message:

Step 3/8 : COPY ./api /api/api
COPY failed: file not found in build context or excluded by .dockerignore: stat api: file does not exist

What am I doing wrong here?

CodePudding user response:

Your build context in the docker-compose file is build: ./services/api

project
│  docker-compose.yaml 
|  requirements.txt  
│
└───<dir>services   
   │
   └───<dir>api  <--- docker_model Dockerfile executes from here
   |      │   Dockerfile
   |      │   main.py
   |      |
   |       <dir>model
   |          file.model
   |          file.model
   └───<dir>statspy  
            file.dev.toml
            file.prod.toml

You later try to do COPY ./api /api/api. There is no api dir in /services/api, so the COPY directive fails.

What you probably want to do instead is COPY . /api. The rest of the Dockerfile looks correct.

  • Related