`docker-compose up` 不会为 PostgreSQL 容器创建持久卷
`docker-compose up` doesn't create a persistent volume for PostgreSQL container
我正在尝试为 postgres docker 容器创建持久卷存储。因为我将在这个 docker 环境中有一些其他服务,所以我使用 docker-compose
来启动容器。
我的 docker-compose.yml
文件的内容是:
version: "3.8"
services:
db:
image: postgres:12.3
volumes:
- ./postgres-data:/var/lib/posgresql/data
environment:
- POSTGRES_NAME=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
volumes:
postgres-data:
我运行命令:
docker-compose up
现在,基于documentation, and this example,我希望创建一个持久卷,其名称包括postgres-data
(例如,postgres-volume_postgres-data
)。
而是创建了两个卷:
docker volume ls
输出:
DRIVER VOLUME NAME
local a53a5b161f0fefca840e2f0cd2a97ad019864dea23c7f23f07c94e6be7ace601
local postgres-volume_postgres-data
正在检查卷:
docker volume inspect a53a5b161f0fefca840e2f0cd2a97ad019864dea23c7f23f07c94e6be7ace601
输出:
[
{
"CreatedAt": "2022-02-07T19:12:04Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/a53a5b161f0fefca840e2f0cd2a97ad019864dea23c7f23f07c94e6be7ace601/_data",
"Name": "a53a5b161f0fefca840e2f0cd2a97ad019864dea23c7f23f07c94e6be7ace601",
"Options": null,
"Scope": "local"
}
]
检查第二卷:
docker volume inspect postgres-volume_postgres-data
输出:
[
{
"CreatedAt": "2022-02-07T19:12:02Z",
"Driver": "local",
"Labels": {
"com.docker.compose.project": "postgres-volume",
"com.docker.compose.version": "1.29.2",
"com.docker.compose.volume": "postgres-data"
},
"Mountpoint": "/var/lib/docker/volumes/postgres-volume_postgres-data/_data",
"Name": "postgres-volume_postgres-data",
"Options": null,
"Scope": "local"
}
]
这两个卷中只有 a53a5b161f0fefca840e2f0cd2a97ad019864dea23c7f23f07c94e6be7ace601
处于活动状态,所有数据似乎都存储在该卷中。
效果是当我使用docker-compose down
时,容器运行ning时保存到数据库的所有数据都丢失了,即数据没有持久化,它们不可用在 运行再次 docker-compose up
之后。
我做错了什么?
(我使用的是 macOS Big Sur,v.11.4。)
Docker & docker-compose
版本:
➜ ~ docker --version
Docker version 20.10.7, build f0df350
➜ ~ docker-compose version
docker-compose version 1.29.2, build 5becea4c
docker-py version: 5.0.0
CPython version: 3.9.0
OpenSSL version: OpenSSL 1.1.1h 22 Sep 2020
您正在做的事情称为 'bind mount',其中主机上的目录映射到容器中的目录。
如果要创建卷,语法会略有不同。改为这样做
- postgres-data:/var/lib/posgresql/data
(即卷名前没有路径信息)
当前,您正在装载一个主机路径。移除容器时其内容会丢失。您想要的是一个命名卷。在初始创建命名卷后,您可以跨服务重用它,它将在后续调用中持久保存。
在 docker-compose
中,以下将创建命名卷 myapp
并在名为 'frontend' 的服务中使用它。 docs and compose reference 解释得很好。
version: "3.9"
services:
frontend:
image: node:lts
volumes:
- myapp:/home/node/app
volumes:
myapp:
实际上,您还可以使用 docker volume create myapp
在外部创建卷,然后在 docker-compose
设置中引用它们并添加 external: true
.
volumes:
myapp:
external: true
我正在尝试为 postgres docker 容器创建持久卷存储。因为我将在这个 docker 环境中有一些其他服务,所以我使用 docker-compose
来启动容器。
我的 docker-compose.yml
文件的内容是:
version: "3.8"
services:
db:
image: postgres:12.3
volumes:
- ./postgres-data:/var/lib/posgresql/data
environment:
- POSTGRES_NAME=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
volumes:
postgres-data:
我运行命令:
docker-compose up
现在,基于documentation, and this example,我希望创建一个持久卷,其名称包括postgres-data
(例如,postgres-volume_postgres-data
)。
而是创建了两个卷:
docker volume ls
输出:
DRIVER VOLUME NAME
local a53a5b161f0fefca840e2f0cd2a97ad019864dea23c7f23f07c94e6be7ace601
local postgres-volume_postgres-data
正在检查卷:
docker volume inspect a53a5b161f0fefca840e2f0cd2a97ad019864dea23c7f23f07c94e6be7ace601
输出:
[
{
"CreatedAt": "2022-02-07T19:12:04Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/a53a5b161f0fefca840e2f0cd2a97ad019864dea23c7f23f07c94e6be7ace601/_data",
"Name": "a53a5b161f0fefca840e2f0cd2a97ad019864dea23c7f23f07c94e6be7ace601",
"Options": null,
"Scope": "local"
}
]
检查第二卷:
docker volume inspect postgres-volume_postgres-data
输出:
[
{
"CreatedAt": "2022-02-07T19:12:02Z",
"Driver": "local",
"Labels": {
"com.docker.compose.project": "postgres-volume",
"com.docker.compose.version": "1.29.2",
"com.docker.compose.volume": "postgres-data"
},
"Mountpoint": "/var/lib/docker/volumes/postgres-volume_postgres-data/_data",
"Name": "postgres-volume_postgres-data",
"Options": null,
"Scope": "local"
}
]
这两个卷中只有 a53a5b161f0fefca840e2f0cd2a97ad019864dea23c7f23f07c94e6be7ace601
处于活动状态,所有数据似乎都存储在该卷中。
效果是当我使用docker-compose down
时,容器运行ning时保存到数据库的所有数据都丢失了,即数据没有持久化,它们不可用在 运行再次 docker-compose up
之后。
我做错了什么?
(我使用的是 macOS Big Sur,v.11.4。)
Docker & docker-compose
版本:
➜ ~ docker --version
Docker version 20.10.7, build f0df350
➜ ~ docker-compose version
docker-compose version 1.29.2, build 5becea4c
docker-py version: 5.0.0
CPython version: 3.9.0
OpenSSL version: OpenSSL 1.1.1h 22 Sep 2020
您正在做的事情称为 'bind mount',其中主机上的目录映射到容器中的目录。
如果要创建卷,语法会略有不同。改为这样做
- postgres-data:/var/lib/posgresql/data
(即卷名前没有路径信息)
当前,您正在装载一个主机路径。移除容器时其内容会丢失。您想要的是一个命名卷。在初始创建命名卷后,您可以跨服务重用它,它将在后续调用中持久保存。
在 docker-compose
中,以下将创建命名卷 myapp
并在名为 'frontend' 的服务中使用它。 docs and compose reference 解释得很好。
version: "3.9"
services:
frontend:
image: node:lts
volumes:
- myapp:/home/node/app
volumes:
myapp:
实际上,您还可以使用 docker volume create myapp
在外部创建卷,然后在 docker-compose
设置中引用它们并添加 external: true
.
volumes:
myapp:
external: true