如何在django项目上安装带有docker的postgres扩展



我想在我的Django项目中添加全文搜索,我使用了PostgreSQL和docker,所以我想在PostgreSQL中添加扩展pg_trgm来进行三元组相似性搜索。我应该如何使用dockerfile安装此扩展?

在中共享了我的存储库链接。

FROM python:3.8.10-alpine
WORKDIR /Blog/

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

RUN apk update && apk add postgresql-dev gcc python3-dev musl-dev

RUN pip install --upgrade pip
COPY ./requirements.txt .
RUN pip install -r requirements.txt

COPY ./entrypoint.sh .
RUN sed -i 's/r$//g' ./entrypoint.sh
RUN chmod +x ./entrypoint.sh
COPY . .
ENTRYPOINT ["./entrypoint.sh"]

docker撰写

services:
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/Blog
ports:
- 8000:8000
env_file:
- ./.env.dev
depends_on:
- db
db:
image: postgres:12.0-alpine
volumes:
- postgres_data:/var/lib/postgresql/data/
environment:
- POSTGRES_USER=helo
- POSTGRES_PASSWORD=helo
- POSTGRES_DB=helo

volumes:`enter code here`
postgres_data:

你可以通过艰苦的方式做到这一点!

$ sudo docker-compose exec db bash
$ psql -U username -d database
$ create extension pg_trgm;

这不是一个好方法,因为每次创建图像时都必须小心并重新安装。

使用默认django解决方案:

https://docs.djangoproject.com/en/4.0/ref/contrib/postgres/operations/#trigramextension

from django.contrib.postgres.operations import TrigramExtension
class Migration(migrations.Migration):
...
operations = [
TrigramExtension(),
...
]

对于从头开始构建PostgreSQL映像的人来说,另一种更干净的方法是包括他/她想要构建映像的所有扩展,方法是在环境变量下使用POSTGRES_EEXTENSIONS:(在docker-compose.yml文件内(指定它们

services:
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/Blog
ports:
- 8000:8000
env_file:
- ./.env.dev
depends_on:
- db
db:
image: postgres:12.0-alpine
volumes:
- postgres_data:/var/lib/postgresql/data/
environment:
POSTGRES_USER: helo
POSTGRES_PASSWORD: helo
POSTGRES_DB: helo
POSTGRES_EXTENSIONS: pg_trgm ,your_other_extension

volumes:`enter code here`
postgres_data:

将您的_other_extension替换为要安装的扩展名,并确保用逗号分隔它们。

除了POSTGRES_PASSWORD、POSTGRES_DB、POSTGERS_USER和POSTGRES_EEXTENSIONS之外,还可以为PostgreSQL容器设置其他环境变量。以下是一些常用的:

  • POSTGRES_HOST_AUTH_METHOD-用于连接到数据库的身份验证方法
  • PGDATA:-PostgreSQL数据目录的位置
  • POSTGRES_INITDB_ARGS:创建数据库集群时要传递给INITDB命令的其他参数
  • 最新更新