#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