docker-compose down 不持久化 postgresql 数据
docker-compose down not persisting postgresql data
我的docker-撰写文件:
version: '3'
services:
app:
container_name: application
build: .cloud/php
image: app-application
depends_on:
- pgres
ports:
- "9050:9000"
volumes:
- ./:/var/www:cached
networks:
- application_network
nginx:
container_name: application.nginx
image: nginx
ports:
- "8050:8000"
volumes:
- .cloud/nginx/nginx.conf:/etc/nginx/conf.d/default.conf:cached
- ./:/var/www:cached
depends_on:
- app
networks:
- application_network
pgres:
container_name: application.postgres
image: postgres
restart: always
ports:
- "54325:5432"
environment:
POSTGRES_DB: application
POSTGRES_USER: postgres
POSTGRES_PASSWORD: example
PGDATA: /tmp
volumes:
- .cloud/postgres/data:/var/lib/postgresql/data
networks:
- application_network
networks:
application_network:
driver: bridge
当我 运行 docker-compose down 时,postgresql 数据不持久并且数据库完全重置。我试图将 postgresql 卷放入它自己的 /postgresql/data 文件夹中,但结果仍然相同。我在这里错过了什么?
问题就在这里
environment:
PGDATA: /tmp
volumes:
- .cloud/postgres/data:/var/lib/postgresql/data
使用 PGDATA
环境变量,您正在明确设置 clustur data dicrectory。因此,它的作用是,一旦您启动容器(例如通过 docker-compose up
),Postgres 服务器将根据 /tmp
目录中的 PGDATA
设置保留您的数据库数据。
另一方面,您在容器中安装了不同的路径 (/var/lib/postgresql/data
) 而不是 /tmp
路径。因此,一旦你 运行 docker-compose down
,/tmp
中的容器和持久化数据将永远消失,因为 /tmp
未设置为挂载点。所以,除非你真的需要这样做,否则你最好不要碰它。
工作配置可能看起来像这样(为简洁起见缩短):
version: '3'
services:
pgres:
image: "postgres" # use latest official postgres version or a specific version e.g. postgres:10.12
volumes:
- .cloud/postgres/:/var/lib/postgresql/data/ # persist data even if container shuts down
另一件事是,即使假设您像这样通过 PGDATA
配置它
environment:
PGDATA: /tmp
volumes:
- .cloud/postgres/data:/tmp
这不是一个好主意,因为路径 /tmp
在您的情况下,正如名称 tmp
(temporary) 所暗示的那样,真的不靠谱。 docker-compose down
可能根本不会影响它,但是在下次启动时,即一旦你再次 运行 docker-compose up
,底层的 OS (Linux) 将会非常很可能会删除目录 /tmp
的内容,因此挂载的本地目录 .cloud/postgres/data
也将立即清空,您的持久数据将消失。在任何情况下,/tmp
目录在某种程度上由 Linux 管理,因此保存在那里的数据可能会随时消失 - 所以不要依赖它!
我的docker-撰写文件:
version: '3'
services:
app:
container_name: application
build: .cloud/php
image: app-application
depends_on:
- pgres
ports:
- "9050:9000"
volumes:
- ./:/var/www:cached
networks:
- application_network
nginx:
container_name: application.nginx
image: nginx
ports:
- "8050:8000"
volumes:
- .cloud/nginx/nginx.conf:/etc/nginx/conf.d/default.conf:cached
- ./:/var/www:cached
depends_on:
- app
networks:
- application_network
pgres:
container_name: application.postgres
image: postgres
restart: always
ports:
- "54325:5432"
environment:
POSTGRES_DB: application
POSTGRES_USER: postgres
POSTGRES_PASSWORD: example
PGDATA: /tmp
volumes:
- .cloud/postgres/data:/var/lib/postgresql/data
networks:
- application_network
networks:
application_network:
driver: bridge
当我 运行 docker-compose down 时,postgresql 数据不持久并且数据库完全重置。我试图将 postgresql 卷放入它自己的 /postgresql/data 文件夹中,但结果仍然相同。我在这里错过了什么?
问题就在这里
environment:
PGDATA: /tmp
volumes:
- .cloud/postgres/data:/var/lib/postgresql/data
使用 PGDATA
环境变量,您正在明确设置 clustur data dicrectory。因此,它的作用是,一旦您启动容器(例如通过 docker-compose up
),Postgres 服务器将根据 /tmp
目录中的 PGDATA
设置保留您的数据库数据。
另一方面,您在容器中安装了不同的路径 (/var/lib/postgresql/data
) 而不是 /tmp
路径。因此,一旦你 运行 docker-compose down
,/tmp
中的容器和持久化数据将永远消失,因为 /tmp
未设置为挂载点。所以,除非你真的需要这样做,否则你最好不要碰它。
工作配置可能看起来像这样(为简洁起见缩短):
version: '3'
services:
pgres:
image: "postgres" # use latest official postgres version or a specific version e.g. postgres:10.12
volumes:
- .cloud/postgres/:/var/lib/postgresql/data/ # persist data even if container shuts down
另一件事是,即使假设您像这样通过 PGDATA
配置它
environment:
PGDATA: /tmp
volumes:
- .cloud/postgres/data:/tmp
这不是一个好主意,因为路径 /tmp
在您的情况下,正如名称 tmp
(temporary) 所暗示的那样,真的不靠谱。 docker-compose down
可能根本不会影响它,但是在下次启动时,即一旦你再次 运行 docker-compose up
,底层的 OS (Linux) 将会非常很可能会删除目录 /tmp
的内容,因此挂载的本地目录 .cloud/postgres/data
也将立即清空,您的持久数据将消失。在任何情况下,/tmp
目录在某种程度上由 Linux 管理,因此保存在那里的数据可能会随时消失 - 所以不要依赖它!