当我关闭后端容器时,Docker丢失了Postgres服务器数据

时间:2020-04-27 10:48:31

标签: postgresql docker docker-compose

我有以下docker-compose文件,它在端口80上为应用程序服务。

version: '3'

services:
    backend:
        build: ./Django-Backend
        command: gunicorn testing.wsgi:application --bind 0.0.0.0:8000 --log-level debug
        expose:
            - "8000"
        volumes:
            - static:/code/backend/static
        env_file:
            - ./.env.prod

    nginx:
        build: ./nginx
        ports:
            - 80:80
        volumes:
            - static:/static
        depends_on:
            - backend

    db:
        image: postgres
        environment:
            - POSTGRES_DB=postgres
            - POSTGRES_USER=postgres
            - POSTGRES_PASSWORD=postgres
        volumes:
            - postgres_data:/var/lib/postgresql/data/

volumes:
    static:
    postgres_data:

一旦进入该页面,我便可以登录管理员并添加一个额外的用户,该用户将保存到数据库中,因为我可以重新加载页面,并且该用户仍在该页面中。一旦我停止后端docker容器,该用户就消失了。鉴于Postgres在不同的容器中运行,并且我没有降低它的速度,所以我不确定停止后端容器并重新启动它是如何导致数据不可用的。

谢谢。

编辑: 我使用以下命令启动docker容器。

docker-compose -f docker-compose.prod.yml up -d

我只是通过使用docker桌面并停止容器来放下容器。

我正在为后端运行DJANGO 3,并且还尝试在容器运行时在终端中添加超级用户:

# python manage.py createsuperuser 
Username (leave blank to use 'root'): mikey
Email address: 
Password: 
Password (again): 
This password is too common.
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.

在容器运行时,这起作用并且用户出现。但是,当我再次通过docker桌面关闭容器然后重新启动容器时,刚创建的用户就消失了。

进一步编辑:

settings.py使用dotenv“从dotenv导入load_dotenv”

DATABASES = {
    "default": {
        "ENGINE": os.getenv("SQL_ENGINE"),
        "NAME": os.getenv("SQL_DATABASE"),
        "USER": os.getenv("SQL_USER"),
        "PASSWORD": os.getenv("SQL_PASSWORD"),
        "HOST": os.getenv("SQL_HOST"),
        "PORT": os.getenv("SQL_PORT"),
    }
}

.env.prod文件具有以下值:

DEBUG=0
DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1 [::1]
SQL_ENGINE=django.db.backends.postgresql
SQL_DATABASE=postgres
SQL_USER=postgres
SQL_PASSWORD=postgres
SQL_HOST=db
SQL_PORT=5432

解决方案:

阅读评论以查看其他图例的诊断,但更新的docker-compose文件如下所示。请注意“ depends_on”块。

version: '3'

services:
    backend:
        build: ./Django-Backend
        command: gunicorn testing.wsgi:application --bind 0.0.0.0:8000 --log-level debug
        expose:
            - "8000"
        volumes:
            - static:/code/backend/static
        env_file:
            - ./.env.prod
        depends_on:
            - db

    nginx:
        build: ./nginx
        ports:
            - 80:80
        volumes:
            - static:/static
        depends_on:
            - backend

    db:
        image: postgres
        environment:
            - POSTGRES_DB=postgres
            - POSTGRES_USER=postgres
            - POSTGRES_PASSWORD=postgres
        volumes:
            - postgres_data:/var/lib/postgresql/data/
        expose:
            - "5432"

volumes:
    static:
    postgres_data:

最终编辑:

将以下代码添加到我的entrypoint.sh文件中,以确保Postgres准备好接受后端容器的连接。

if [ "$DATABASE" = "postgres" ]
then
    echo "Waiting for postgres..."

    while ! nc -z $SQL_HOST $SQL_PORT; do
      sleep 0.1
    done

    echo "PostgreSQL started"
fi

0 个答案:

没有答案