[英]Connecting Docker Postgres container to an existing empty database
我想创建一个包含空数据库(即一系列空表)的 tarball 和一个 shell 脚本,该脚本启动将连接到空数据库的 Postgres 容器。 最终产品是一个 .tar.gz,它有一个 db 的副本、一个启动脚本和一个停止脚本。 所有这些都适用于 macOS
为了创建数据库,我在笔记本电脑上本地启动了一个 Postgres 服务器,并创建了一个名为“postgres-15year”的数据库。 在 CLI 中使用“DBeaver”数据库管理器和“psql”,我可以看到 dbase 已正确创建且功能正常。
然后我创建了以下脚本:
启动文件
#!/bin/bash
echo $(pwd)
docker run --rm --name payments-15years -e POSTGRES_PASSWORD=docker -d -p5432:5432 -v$(pwd)/postgres-15year/data:/var/lib/postgresql/data:delegated postgres:11.6
停止.sh
#!/bin/bash
docker stop payments-15years
echo "docker stop payments-15years"
然后我将所有这些放在我想要压缩的目录中。
因此,用户将接收 tarball,解压缩并运行启动脚本,并能够连接到具有预定义结构和模式的数据库。 这是我认为“我的 start.sh”脚本正在做的事情:
我的挑战是在运行启动脚本 'docker ps' 后返回:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
14d2cba6abe2 postgres:11.6 "docker-entrypoint.s…" 44 seconds ago Up 42 seconds 0.0.0.0:5432->5432/tcp payments-15years
但是当我这样做然后从 CLI 运行“psql”时:
docker exec -it payments-15years psql -U postgres
数据库 ('postgres-15year') 未列出。
有没有人看到我的方法有什么问题?
笔记:
其实,当你跑了命令-v $(pwd)/postgres-15year/data:/var/lib/postgresql/data:delegated
,按照官方文档postgres-docker
。
命令的
-v /my/own/datadir:/var/lib/postgresql/data
部分将/my/own/datadir
目录从底层主机系统挂载为容器内的/var/lib/postgresql/data
,其中PostgreSQL 默认会写入它的数据文件。
所以你只是在创建一个数据目录而不是一个数据库。 您可以使用inspect
关键字进行inspect
。
docker container inspect <container_name>
在您的方案 Payments-15years 中,提供了有关数量的详细信息,
"Mounts": [
{
"Type": "bind",
"Source": "/Users/macair/postgres-15year/data",
"Destination": "/var/lib/postgresql/data",
"Mode": "delegated",
"RW": true,
"Propagation": "rprivate"
}
],
要创建数据库,请像以前一样执行交互式会话并手动创建数据库或尝试此操作。
docker run -it --rm --network some-network postgres psql -h some-postgres -U postgres
先参考你的评论,
我能够使用交互式创建数据库。 要使用正确的模式填充空数据库,我有一个 pg-dump 文件 (.sql)。 我不确定如何使该文件可用于容器。 想法?
如果您有转储文件,为什么要在容器启动后运行命令?
最好将其作为 Dockerfile 的一部分,您将不需要手动转储 Docker 映像将处理它。
FROM postgres
ADD mydb.sql /docker-entrypoint-initdb.d
现在,如果您启动容器,DB 将自动填充。
初始化脚本
如果您想在从该镜像派生的镜像中进行额外的初始化,请在
/docker-entrypoint-initdb.d
下添加一个或多个 *.sql、*.sql.gz 或 *.sh 脚本(如有必要,创建目录)。 在入口点调用 initdb 创建默认的 postgres 用户和数据库后,它将运行任何 *.sql 文件,运行任何可执行的 *.sh 脚本,并在该目录中找到任何不可执行的 *.sh 脚本以在此之前进行进一步的初始化启动服务。
现在来回答你的问题,你可以用 Tarball 来做到这一点,tar 不处理 volume 而 Postgres docker image 带有volume 。 所以你需要按照 Dockerfile 在启动时导入数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.