Django/Docker/Postgresql - psycopg2 错误

Django/Docker/Postgresql - psycopg2 error

希望您能帮助我解决以下问题。这是我第一次使用 docker 和 docker-compose。我正在尝试在 Postgresql 数据库上“dockerize”我的 Django 项目 运行,但我遇到了 psycopg2 模块的问题。我正在使用 psycopg2-binary,因为它通常是唯一适用于我的配置的。我已经尝试了标准的 psycopg2 包,但它仍然不起作用。


所以我将首先向您展示我的一些文件:

settings.py的相关部分:

import os

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATES_DIRS = os.path.join(BASE_DIR, "templates")

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = os.environ.get('SECRET_KEY', 'changeme')


# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []
ALLOWED_HOSTS_ENV = os.environ.get('ALLOWED_HOSTS')
if ALLOWED_HOSTS_ENV:
    ALLOWED_HOSTS.extend(ALLOWED_HOSTS_ENV.split(','))



# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'core.apps.CoreConfig',
    'django.contrib.staticfiles',
    'jquery',
    'ckeditor',
    'ckeditor_uploader',
    'crispy_forms',
    
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'littledreamgardens.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'core/templates/core/')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                'core.views.category_list',
            ],
        },
    },
]

WSGI_APPLICATION = 'littledreamgardens.wsgi.application'


# Database
# https://docs.djangoproject.com/en/3.0/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'gardens',
        'USER': 'gardens',
        'PASSWORD': '***',
        'HOST': 'db',
        'PORT': 5432
    }
}

docker-compose.yml:

version: '3.7'

services:
  app:
    build:
      context: .
    ports:
      - "8000:8000"
    volumes:
      - ./littledreamgardens:/app
    command: sh -c "python manage.py runserver 0.0.0.0:8000"
    environment:
      - DEBUG=1
    depends_on:
      - db
  db:
    image: 
      postgres
    environment: 
      POSTGRES_NAME: gardens
      POSTGRES_USER: gardens
      POSTGRES_PASSWORD: ***

Docker 文件:

FROM python:3.8-alpine

ENV PATH="/scripts:${PATH}"

COPY ./requirements.txt /requirements.txt
RUN apk add --update --no-cache --virtual .tmp gcc libc-dev linux-headers postgresql-dev postgresql-client libffi libressl gcc python3-dev musl-dev jpeg-dev zlib-dev
RUN pip3 install -r /requirements.txt
RUN apk del .tmp

RUN mkdir /app
COPY ./littledreamgardens /app
WORKDIR /app
COPY ./scripts /scripts

RUN chmod +x /scripts/*

RUN mkdir -p /vol/web/media
RUN mkdir -p /vol/web/static
RUN adduser -D user
RUN chown -R user:user /vol
RUN chmod -R 755 /vol/web
USER user

CMD ["entrypoint.sh"]

Requirements.txt:

appdirs==1.4.4
asgiref==3.3.1
black==20.8b1
click==7.1.2
Django>=3.0.4,<4.0
psycopg2-binary>=2.8.6
django-ckeditor==6.0.0
django-crispy-forms==1.11.1
django-jquery==3.1.0
django-js-asset==1.2.2
django-tinymce==3.2.0
isort==5.7.0
mypy-extensions==0.4.3
pathspec==0.8.1
Pillow==8.0.1
pytz==2020.4
regex==2020.11.13
sqlparse==0.4.1
toml==0.10.2
typed-ast==1.4.2
typing-extensions==3.7.4.3
uWSGI>=2.0.18<2.1

航站楼:

WARNING: Found orphan containers (littledreamgardens_littlegreendreams_1, littledreamgardens_littledreamgardens_1) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
Starting littledreamgardens_db_1 ... done
Starting littledreamgardens_app_1 ... done
Attaching to littledreamgardens_db_1, littledreamgardens_app_1
db_1   | 
db_1   | PostgreSQL Database directory appears to contain a database; Skipping initialization
db_1   | 
db_1   | 2021-03-21 17:42:49.909 UTC [1] LOG:  starting PostgreSQL 13.2 (Debian 13.2-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
db_1   | 2021-03-21 17:42:49.909 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
db_1   | 2021-03-21 17:42:49.909 UTC [1] LOG:  listening on IPv6 address "::", port 5432
db_1   | 2021-03-21 17:42:49.992 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
db_1   | 2021-03-21 17:42:50.056 UTC [26] LOG:  database system was shut down at 2021-03-21 17:42:38 UTC
db_1   | 2021-03-21 17:42:50.082 UTC [1] LOG:  database system is ready to accept connections
app_1  | Watching for file changes with StatReloader
app_1  | Exception in thread django-main-thread:
app_1  | Traceback (most recent call last):
app_1  |   File "/usr/local/lib/python3.8/site-packages/django/db/backends/postgresql/base.py", line 25, in <module>
app_1  |     import psycopg2 as Database
app_1  |   File "/usr/local/lib/python3.8/site-packages/psycopg2/__init__.py", line 51, in <module>
app_1  |     from psycopg2._psycopg import (                     # noqa
app_1  | ImportError: Error loading shared library libpq.so.5: No such file or directory (needed by /usr/local/lib/python3.8/site-packages/psycopg2/_psycopg.cpython-38-x86_64-linux-gnu.so)
app_1  | 
app_1  | During handling of the above exception, another exception occurred:
app_1  | 
app_1  | Traceback (most recent call last):
app_1  |   File "/usr/local/lib/python3.8/threading.py", line 932, in _bootstrap_inner
app_1  |     self.run()
app_1  |   File "/usr/local/lib/python3.8/threading.py", line 870, in run
app_1  |     self._target(*self._args, **self._kwargs)
app_1  |   File "/usr/local/lib/python3.8/site-packages/django/utils/autoreload.py", line 53, in wrapper
app_1  |     fn(*args, **kwargs)
app_1  |   File "/usr/local/lib/python3.8/site-packages/django/core/management/commands/runserver.py", line 110, in inner_run
app_1  |     autoreload.raise_last_exception()
app_1  |   File "/usr/local/lib/python3.8/site-packages/django/utils/autoreload.py", line 76, in raise_last_exception
app_1  |     raise _exception[1]
app_1  |   File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 357, in execute
app_1  |     autoreload.check_errors(django.setup)()
app_1  |   File "/usr/local/lib/python3.8/site-packages/django/utils/autoreload.py", line 53, in wrapper
app_1  |     fn(*args, **kwargs)
app_1  |   File "/usr/local/lib/python3.8/site-packages/django/__init__.py", line 24, in setup
app_1  |     apps.populate(settings.INSTALLED_APPS)
app_1  |   File "/usr/local/lib/python3.8/site-packages/django/apps/registry.py", line 114, in populate
app_1  |     app_config.import_models()
app_1  |   File "/usr/local/lib/python3.8/site-packages/django/apps/config.py", line 211, in import_models
app_1  |     self.models_module = import_module(models_module_name)
app_1  |   File "/usr/local/lib/python3.8/importlib/__init__.py", line 127, in import_module
app_1  |     return _bootstrap._gcd_import(name[level:], package, level)
app_1  |   File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
app_1  |   File "<frozen importlib._bootstrap>", line 991, in _find_and_load
app_1  |   File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
app_1  |   File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
app_1  |   File "<frozen importlib._bootstrap_external>", line 783, in exec_module
app_1  |   File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
app_1  |   File "/usr/local/lib/python3.8/site-packages/django/contrib/auth/models.py", line 2, in <module>
app_1  |     from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
app_1  |   File "/usr/local/lib/python3.8/site-packages/django/contrib/auth/base_user.py", line 48, in <module>
app_1  |     class AbstractBaseUser(models.Model):
app_1  |   File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 122, in __new__
app_1  |     new_class.add_to_class('_meta', Options(meta, app_label))
app_1  |   File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 326, in add_to_class
app_1  |     value.contribute_to_class(cls, name)
app_1  |   File "/usr/local/lib/python3.8/site-packages/django/db/models/options.py", line 206, in contribute_to_class
app_1  |     self.db_table = truncate_name(self.db_table, connection.ops.max_name_length())
app_1  |   File "/usr/local/lib/python3.8/site-packages/django/db/__init__.py", line 28, in __getattr__
app_1  |     return getattr(connections[DEFAULT_DB_ALIAS], item)
app_1  |   File "/usr/local/lib/python3.8/site-packages/django/db/utils.py", line 214, in __getitem__
app_1  |     backend = load_backend(db['ENGINE'])
app_1  |   File "/usr/local/lib/python3.8/site-packages/django/db/utils.py", line 111, in load_backend
app_1  |     return import_module('%s.base' % backend_name)
app_1  |   File "/usr/local/lib/python3.8/importlib/__init__.py", line 127, in import_module
app_1  |     return _bootstrap._gcd_import(name[level:], package, level)
app_1  |   File "/usr/local/lib/python3.8/site-packages/django/db/backends/postgresql/base.py", line 29, in <module>
app_1  |     raise ImproperlyConfigured("Error loading psycopg2 module: %s" % e)
app_1  | django.core.exceptions.ImproperlyConfigured: Error loading psycopg2 module: Error loading shared library libpq.so.5: No such file or directory (needed by /usr/local/lib/python3.8/site-packages/psycopg2/_psycopg.cpython-38-x86_64-linux-gnu.so)

这个问题和这个类似 or this github issue

要么是捆绑了太多的命令导致依赖性出错的问题,要么是包不兼容的问题。您没有固定 psycopg2 版本 (>=)。您可以尝试固定特定版本。

Psycopg2-binary 是我用于本地开发的,但是 docker 我通常坚持使用常规的 psycopg2