Ошибка Docker при установке зависимостей python — нет модуля с именем «базы данных»

#python #docker #docker-compose

#python #docker #docker-compose

Вопрос:

Я пытаюсь запустить контейнер docker с помощью docker-compose. Для установки зависимостей python я использую pipenv. В этом контейнере я пытаюсь запустить приложение FastApi с асинхронными базами данных, используя библиотеку «базы данных».

Это мой Pip-файл:

 [[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
fastapi = {extras = ["all"], version = "*"}
databases = {extras = ["postgresql"], version = "*"}

[dev-packages]

[requires]
 

Dockerfile:

 # Pull base image
FROM python:3.8
# Set environment varibles
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
ENV PYTHONPATH=./code
WORKDIR /code/
# Install dependencies
RUN pip install pipenv
COPY Pipfile Pipfile.lock /code/
#RUN pipenv install --system --dev
RUN pipenv install --deploy --system
RUN pipenv install databases
COPY . /code/
EXPOSE 8000
#CMD ["python", "main.py"]
CMD pipenv run python main.py
 

Docker-compose.yml

 version: "3"
services:
  postgres:
    image: postgres:11
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=postgres
    volumes:
      - data:/var/lib/postgresql/data

  app:
    build: .
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - postgres
      - redis

  pgadmin:
    container_name: pgadmin
    image: dpage/pgadmin4
    environment:
      - PGADMIN_DEFAULT_EMAIL=pgadmin4@pgadmin.org
      - PGADMIN_DEFAULT_PASSWORD=admin
    ports:
      - "5050:80"
    depends_on:
      - postgres

  redis:
    image: "redis:alpine"
    ports:
      - "6379:6379"

volumes:
  data: {}
 

И main.py файл:

 import uvicorn
from fastapi import FastAPI, Depends
from pydantic import BaseModel
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, Session
import databases

SQLALCHEMY_DATABASE_URL = "postgresql://postgres:postgres@postgres/postgres"

database = databases.Database(SQLALCHEMY_DATABASE_URL)

engine = create_engine(SQLALCHEMY_DATABASE_URL)

Base = declarative_base()

class UserModel(Base):
    __tablename__ = "users"

    id = Column(Integer, primary_key=True, index=True)
    first_name = Column(String, unique=True, index=True)
    last_name = Column(String)
    age = Column(Integer,)


Base.metadata.create_all(bind=engine)

app = FastAPI()

class UserSchema(BaseModel):
    first_name: str
    last_name: str = None
    age: int

    class Config:
        orm_mode = True

user_table = UserModel.__table__


@app.post("/user/", response_model=UserSchema)
async def create_user(user: UserSchema):
    query = user_table.insert().values(
        first_name=user.first_name, last_name=user.last_name, age=user.age
    )
    last_rec = await database.execute(query)
    return {**user.dict(), "id":last_red}


@app.get("/user/", response_model=UserSchema)
async def get_user(first_name: str):
    _user = user_table.select().where(first_name=first_name)
    return _user


if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)
 

Я не уверен, почему я все еще получаю эту ошибку:

 Traceback (most recent call last):
  File "main.py", line 7, in <module>
    import databases
ModuleNotFoundError: No module named 'databases'
 

Есть идеи?

С уважением

Комментарии:

1. вы получили сообщение об ошибке при сборке файла DockerFile, например, пакет не найден для баз данных?

2. @Pdeuxa когда я набираю docker-compose up -d, все делается правильно, но когда я проверяю с помощью docker, ps — контейнер не запускается. Проверка с помощью docker logs container_name выдает мне эту ошибку

3. Если у вас есть полные журналы, пожалуйста, предоставьте их. Еще что я сделаю: попробуйте без pipenv, но pip. Если это работает с pip, я думаю, это ваш virtualenv.

4. Лучше ли добавлять зависимость к вашей Pipfile работе, чем устанавливать ее отдельно?

Ответ №1:

Хорошо, итак, я запускаю его, попробуйте этот :

 # Pull base image
FROM python:3.8
# Set environment varibles
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
ENV PYTHONPATH=./code
WORKDIR /code/
# Install dependencies
RUN pip install pipenv
COPY Pipfile.lock /code/Pipfile
RUN pipenv install --deploy
RUN pipenv install psycopg2
COPY . /code/
EXPOSE 8000

CMD pipenv run python main.py
 

Мне пришлось удалить —system и установить другой пакет (psycopg2)

Redis отсутствует в вашем docker-compose. У вас также может возникнуть проблема с привязкой порта к 8000, возможно, postgre или контейнер администратора уже используют его.

введите описание изображения здесь

Комментарии:

1. Я обновил свой первый пост. Я добавил redis, я также заменил свой dockerfile вашим, но все равно получаю ту же ошибку. Сработал ли этот код на вашей стороне?

2. с моей стороны, да, у вас все еще та же ошибка?

3. все еще получаю сообщение об ошибке «Нет модуля с именем databases». Не могли бы вы, пожалуйста, поделиться со мной своим Pip-файлом?

4. то же, что и у вас, я не знаком с Pipfile, попробуйте запустить команду установки из dockerfile, просто для проверки. ЗАПУСТИТЕ pipenv установите fastapi ЗАПУСТИТЕ pipenv установите базы данных ЗАПУСТИТЕ pipenv установите psycopg2

5. Попробуйте docker-compose up —build