我正在尝试不使用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
?
答案 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