Я новичок в докере и пытался докеризовать свое приложение 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
Образ (python:3.8-slim-buster), который вы установили для своей службы, не создан из вашего файла докера. Обратитесь к документации о том, как определить службу, чтобы использовать встроенный образ из вашего файла докеров
@MatsLindh большое спасибо. Это сработало после использования моего собственного образа.
@OluwafemiSule спасибо, шеф, после этого все заработало.
Образ, который вы используете в 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
Это сработало после этого. Большое спасибо
Ваш
image
, кажется, ссылается на собственный образ python-slim-buster, а не на тот, который вы создали:image: python:3.8-slim-buster
- это должна быть ссылка на ваш уже созданный образ контейнера.