Docker 不保留 postgres 卷 [django]
Docker not persisting postgres volume [django]
这里有很多关于我遇到的类似问题的问题,例如 this, , and 非常相似,但是 none 的解决方案解决了我的问题。请不要关闭这个问题。
问题:
我 运行在 docker 上使用 nginx 和 postgres 使用 django。机密信息存储在 .env 文件中。 docker-compose up/start
和 docker-compose down/stop/restart
.
我的 postgres 数据没有持久化
这是我的 docker-compose
文件:
version: '3.7'
services:
web:
build: ./app
command: gunicorn umngane_project.wsgi:application --bind 0.0.0.0:8000
volumes:
- ./app/:/usr/src/app/
expose:
- 8000
environment:
- SECRET_KEY=${SECRET}
- SQL_ENGINE=django.db.backends.postgresql
- SQL_DATABASE=postgres
- SQL_USER=${POSTGRESQLUSER}
- SQL_PASSWORD=${POSTGRESQLPASSWORD}
- SQL_HOST=db
- SQL_PORT=5432
- SU_NAME=${SU_NAME}
- SU_EMAIL=${SU_EMAIL}
- SU_PASSWORD=${SU_PASSWORD}
depends_on:
- db
db:
image: postgres:11.2-alpine
volumes:
- postgres_data:/var/lib/postgresql/data/
nginx:
build: ./nginx
volumes:
- static_volume:/usr/src/app/assets
ports:
- 1337:80
depends_on:
- web
volumes:
postgres_data:
external: true # I tried running without this and the result is the same
static_volume:
我的入口点脚本是这样的:
python manage.py flush --no-input
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser --user "${SU_NAME}" --email "${SU_EMAIL}" --password "${SU_PASSWORD}"
python manage.py collectstatic --no-input
exec "$@"
其中 createsuperuser
是在应用程序中创建超级用户的自定义模块。
此设置不会保留 postgres_data
中的信息。
附加信息:
在做任何事情之前,我使用 docker volume ls
检查没有名为 postgres_data
的卷,然后就得到了。
此时我 运行 docker-compose up -d
/docker-compose up -d --build
一切正常,没有错误。
I 运行 docker inspect postgres_data
它显示 "CreatedAt": "X1"
我能够以超级用户身份登录。我继续创建管理员用户,以超级用户身份注销,然后以任何管理员用户身份登录都没有问题。我 运行 docker exec -it postgres_data psql -U <postgres_user>
以确保管理员用户在数据库中并找到它。
此时我继续 运行 docker-compose down
/docker-compose stop
没有问题。我 运行 docker volume ls
并且显示 postgres_data
仍然存在。
I 运行 docker inspect postgres_data
它显示 "CreatedAt": "X2"
为了测试一切是否按预期工作,我 运行 docker-compose up -d
/docker-compose up -d --build
/docker-compose start
/docker-compose restart
.
I 运行 docker inspect postgres_data
它显示 "CreatedAt": "X3"
此时我继续尝试以管理员用户身份登录,但无法登录。我再次 运行 docker exec -it postgres_data psql -U <postgres_user>
但这次只看到超级用户,没有管理员用户。
(说明:我在这里使用正斜杠来显示我在不同尝试中尝试的所有不同内容。我尝试了此处显示的所有命令组合。)
拥有持久数据的一种方法是指定磁盘上的实际路径而不是创建卷:
...
db:
image: postgres:11.2-alpine
volumes:
- "/local/path/to/postgres/data:/var/lib/postgresql/data/"
...
这样,容器的 postgres 数据位置就会映射到您指定的路径。这样,除非故意删除,否则数据会直接保存在磁盘上。
据我所知,一个 docker 卷将在容器移除时被移除。
问题是您在清除数据库的入口点脚本中 运行 "flush"。每当您启动或重新创建容器时,入口点将 运行。
这里有很多关于我遇到的类似问题的问题,例如 this,
问题:
我 运行在 docker 上使用 nginx 和 postgres 使用 django。机密信息存储在 .env 文件中。 docker-compose up/start
和 docker-compose down/stop/restart
.
这是我的 docker-compose
文件:
version: '3.7'
services:
web:
build: ./app
command: gunicorn umngane_project.wsgi:application --bind 0.0.0.0:8000
volumes:
- ./app/:/usr/src/app/
expose:
- 8000
environment:
- SECRET_KEY=${SECRET}
- SQL_ENGINE=django.db.backends.postgresql
- SQL_DATABASE=postgres
- SQL_USER=${POSTGRESQLUSER}
- SQL_PASSWORD=${POSTGRESQLPASSWORD}
- SQL_HOST=db
- SQL_PORT=5432
- SU_NAME=${SU_NAME}
- SU_EMAIL=${SU_EMAIL}
- SU_PASSWORD=${SU_PASSWORD}
depends_on:
- db
db:
image: postgres:11.2-alpine
volumes:
- postgres_data:/var/lib/postgresql/data/
nginx:
build: ./nginx
volumes:
- static_volume:/usr/src/app/assets
ports:
- 1337:80
depends_on:
- web
volumes:
postgres_data:
external: true # I tried running without this and the result is the same
static_volume:
我的入口点脚本是这样的:
python manage.py flush --no-input
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser --user "${SU_NAME}" --email "${SU_EMAIL}" --password "${SU_PASSWORD}"
python manage.py collectstatic --no-input
exec "$@"
其中 createsuperuser
是在应用程序中创建超级用户的自定义模块。
此设置不会保留 postgres_data
中的信息。
附加信息:
在做任何事情之前,我使用 docker volume ls
检查没有名为 postgres_data
的卷,然后就得到了。
此时我 运行 docker-compose up -d
/docker-compose up -d --build
一切正常,没有错误。
I 运行 docker inspect postgres_data
它显示 "CreatedAt": "X1"
我能够以超级用户身份登录。我继续创建管理员用户,以超级用户身份注销,然后以任何管理员用户身份登录都没有问题。我 运行 docker exec -it postgres_data psql -U <postgres_user>
以确保管理员用户在数据库中并找到它。
此时我继续 运行 docker-compose down
/docker-compose stop
没有问题。我 运行 docker volume ls
并且显示 postgres_data
仍然存在。
I 运行 docker inspect postgres_data
它显示 "CreatedAt": "X2"
为了测试一切是否按预期工作,我 运行 docker-compose up -d
/docker-compose up -d --build
/docker-compose start
/docker-compose restart
.
I 运行 docker inspect postgres_data
它显示 "CreatedAt": "X3"
此时我继续尝试以管理员用户身份登录,但无法登录。我再次 运行 docker exec -it postgres_data psql -U <postgres_user>
但这次只看到超级用户,没有管理员用户。
(说明:我在这里使用正斜杠来显示我在不同尝试中尝试的所有不同内容。我尝试了此处显示的所有命令组合。)
拥有持久数据的一种方法是指定磁盘上的实际路径而不是创建卷:
...
db:
image: postgres:11.2-alpine
volumes:
- "/local/path/to/postgres/data:/var/lib/postgresql/data/"
...
这样,容器的 postgres 数据位置就会映射到您指定的路径。这样,除非故意删除,否则数据会直接保存在磁盘上。 据我所知,一个 docker 卷将在容器移除时被移除。
问题是您在清除数据库的入口点脚本中 运行 "flush"。每当您启动或重新创建容器时,入口点将 运行。