我有一个带有app容器和postgres容器的docker compose文件。
应用程序取决于postgres容器。
我想在app容器开始连接到postgres并运行脚本以在那里创建数据库之前。我怎么能在docker compose中做到这一点?有没有办法在依赖中间运行一些东西?
或者我应该通过ssh连接到服务器,在部署阶段上下运行docker compose。这样我还需要以某种方式在服务器中安装psql。我更喜欢第一个。
你能为我指出正确的方向吗?
我想在app容器开始连接到postgres并运行脚本以在那里创建数据库之前。
你可以通过将(SQL)脚本挂载到Postgres容器的/docker-entrypoint-initdb.d
文件夹中来实现这样的功能(参见the image documentation - Initialization Scripts)。有了这个,您的应用程序不必连接到PostgreSQL容器,但容器可以自行完成所有操作。
但是,这里的一个常见问题是,您的应用程序可能会在准备接受连接并且您的应用程序崩溃之前立即尝试连接到PostgreSQL。您可以通过在应用程序中实现一些try-catch机制来等待PostgreSQL准备好,或者更改应用程序容器的入口点(即sleep 10 && [run_your_app]
)来避免这种情况。
通过声明环境变量POSTGRES_DB
,您可以告诉Postgres在启动时创建一个空数据库并使用env vars名称。
version: '3.5'
services:
db:
image: postgres:11.2-alpine
restart: always
environment:
POSTGRES_DB: myDB
POSTGRES_PASSWORD: myPassword
POSTGRES_USER: myUser