Почему docker compose не может найти модуль uvicorn

Я новичок в докере и пытался докеризовать свое приложение fastapi. Я создал Dockerfile, показанный ниже

# syntax=docker/dockerfile:1

FROM python:3.8-slim-buster

WORKDIR /app

COPY requirements.txt requirements.txt

RUN apt-get update
RUN apt-get -y install libpq-dev gcc
RUN apt-get -y install libnss3-tools
RUN apt-get -y install curl
RUN curl -LJO https://github.com/FiloSottile/mkcert/releases/download/v1.4.4/mkcert-v1.4.4-linux-amd64
RUN mv mkcert-v1.4.4-linux-amd64 mkcert
RUN chmod +x mkcert
RUN ./mkcert -install
RUN ./mkcert -cert-file cert.pem -key-file key.pem 0.0.0.0 localhost 127.0.0.1 ::1

RUN pip3 install -r requirements.txt

COPY . .

CMD ["python3.8", "-m", "uvicorn", "main:app", "--host=0.0.0.0", "--ssl-keyfile=./key.pem",  "--ssl-certfile=./cert.pem"]

и запустил контейнеры и все заработало. Но когда я пытаюсь объединить контейнеры с компоновкой докеров, он говорит мне, что не может найти модуль uvicorn, даже если он находится в файле requirements.txt. Вот фрагмент моего файла компоновки докеров, содержащего серверную службу.

services:

  server:
    container_name: server
    image: python:3.8-slim-buster
    command: ["python3.8", "-m", "uvicorn", "main:app", "--host=0.0.0.0", "--ssl-keyfile=./key.pem",  "--ssl-certfile=./cert.pem"]
    ports:
      - 8000:8000
    working_dir: /app

Я попытался изменить командную часть службы сервера в докере, чтобы

command: bash "python3.8 -m uvicorn main:app --host=0.0.0.0 --ssl-keyfile=./key.pem  --ssl-certfile=./cert.pem"

не работал. изменил его на

command: sh -c "python3.8 -m uvicorn main:app --host=0.0.0.0 --ssl-keyfile=./key.pem  --ssl-certfile=./cert.pem"

не работал.

Я удалил команду полностью, она все еще не работает, продолжает показывать

server | /usr/local/bin/python3.8: No module named uvicorn
server exited with code 1

Ваш image, кажется, ссылается на собственный образ python-slim-buster, а не на тот, который вы создали: image: python:3.8-slim-buster - это должна быть ссылка на ваш уже созданный образ контейнера.

MatsLindh 03.02.2023 09:56

Образ (python:3.8-slim-buster), который вы установили для своей службы, не создан из вашего файла докера. Обратитесь к документации о том, как определить службу, чтобы использовать встроенный образ из вашего файла докеров

Oluwafemi Sule 03.02.2023 09:59

@MatsLindh большое спасибо. Это сработало после использования моего собственного образа.

redd 03.02.2023 10:20

@OluwafemiSule спасибо, шеф, после этого все заработало.

redd 03.02.2023 10:20
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Образ, который вы используете в Docker Compose, — это не тот, который ранее был создан в Dockerfile, а базовый образ Python. Вы можете создать образ из своего Dockerfile

docker build .  -t fastapi

затем измените свой файл docker-compose.yml примерно так

services:
  api:
    image: fastapi
    ports:
      - "8000:8000"

затем запустите docker compose

docker-compose -f docker-compose.yml up

Это сработало после этого. Большое спасибо

redd 03.02.2023 10:21

Другие вопросы по теме