初始化postgres数据库(不使用/docker-entrypoint-initdb.d)

时间:2019-06-26 23:28:23

标签: postgresql docker

我正在尝试不使用the entry point directory来初始化数据库。

这是最小的Dockerfile:

FROM postgres:latest

POSTGRES_DB db
POSTGRES_USER user
POSTGRES_PASSWORD password

ADD db.sql /directory/
ADD script.sh /directory/

CMD ["sh", "/directory/script.sh"] 
# Or ENTRYPOINT ["/directory/script.sh"]?

还有script.sh

psql -d db -U user < /directory/db.sql

这不起作用,因为运行脚本时postgres没有启动。

如何在不使用db.sql的情况下运行/docker-entrypoint-initdb.d

1 个答案:

答案 0 :(得分:1)

如果您查看the standard postgres image's entrypoint script,则支持/docker-entrypoint-initdb.d目录的机制非常复杂:它需要引导数据库目录以及初始用户和数据库,然后它将在后台启动数据库服务器,运行该目录中的所有内容,最后真正运行数据库。如果您要复制此设置,则必须自己完成所有这些步骤。

不过,还有其他设置数据库的方法。您可以创建一个空数据库,然后正常运行应用程序的迁移以创建初始架构。如果您有一个通常在运行psql客户端工具的数据库上运行的SQL文件,则可以使用Docker做完全相同的事情

docker run -d -p 5432:5432 --name postgres postgres:12
psql -h localhost < db.sql