gpt4 book ai didi

django - postgres 和 docker 组合 : change service status to ready after additional initialization

转载 作者:行者123 更新时间:2023-12-02 17:59:10 24 4
gpt4 key购买 nike

就我而言,postgres 数据库用作主要的 django 后端数据库。需要额外的 postgres 初始化。问题是 postgres 的状态服务变成ready在额外的数据库初始化之前。因此,依赖 django 应用程序在数据库初始化之前开始运行。

有没有办法配置postgres服务方式变成 ready额外初始化后?
docker-compose.yml :

version: "3.3"

services:
postgres:
image: library/postgres:11
volumes:
- some_folder:/docker-entrypoint-initdb.d

django_app:
image: custom_django_image:latest
volumes:
- $PWD:/app
ports:
- 8000:8000
depends_on:
- postgres

最佳答案

您的 some_folder , 映射到 Postgres 容器的 /docker-entrypoint-initdb.d location 是您(似乎您正在做的)应该放置初始化脚本的地方。只要里面没有数据
附加到 Postgres 容器 /var/lib/postgresql/data 的可能卷目录(持久数据),在创建容器时,Postgres 将首先运行这些脚本,然后将 Postgres 设置为 ready状态。脚本必须是 .sh.sql文件。 ( documentation )。我将展示我使用的典型工作流程:

我有这个创建多个数据库的脚本:

# create-multiple-databases.sh

set -e
set -u

function create_user_and_database() {
local database=$1
echo " Creating user and database '$database'"
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<-EOSQL
CREATE USER $database;
CREATE DATABASE $database;
GRANT ALL PRIVILEGES ON DATABASE $database TO $database;
EOSQL
}

if [ -n "$POSTGRES_MULTIPLE_DATABASES" ]; then
echo "Multiple database creation requested: $POSTGRES_MULTIPLE_DATABASES"
for db in $(echo $POSTGRES_MULTIPLE_DATABASES | tr ',' ' '); do
create_user_and_database $db
done
echo "Multiple databases created"
fi


docker-compose.yml我设置的文件:

environment:
- POSTGRES_MULTIPLE_DATABASES=dev,test

现在运行时 docker-compose up ,我看到了脚本的输出,然后最后:

postgres_1            | CREATE DATABASE
postgres_1 | GRANT
postgres_1 | Multiple databases created
...
postgres_1 | PostgreSQL init process complete; ready for start up.
postgres_1 |
postgres_1 | 2020-05-23 16:18:40.055 UTC [1] LOG: starting PostgreSQL 12.2 (Debian 12.2-2.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
postgres_1 | 2020-05-23 16:18:40.056 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
postgres_1 | 2020-05-23 16:18:40.056 UTC [1] LOG: listening on IPv6 address "::", port 5432
postgres_1 | 2020-05-23 16:18:40.063 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"

现在在我的 Django 应用程序中,在一个典型的 settings.py 中文件(或类似的相关设置文件),我创建了一个 while 循环,该循环仅在该数据库准备就绪后完成。完成后,Django 服务器继续其初始化过程,然后开始运行服务器。

while True:
from django.db import connections
from django.db.utils import OperationalError
conn = connections["default"] # or some other key in `DATBASES`
try:
c = conn.cursor()
LOGGER.info("Postgres Ready")
break
except OperationalError:
LOGGER.warning("Postgres Not Ready...")
time.sleep(0.5)

如果我已经理解了您的问题,我希望这可以为您提供问题中所需的信息。

关于django - postgres 和 docker 组合 : change service status to ready after additional initialization,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61751216/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com