我们试图构建一个包含完整应用程序的Docker堆栈:一个Postgres数据库和至少一个web应用程序。
当堆栈启动时,我们预计应用程序会立即工作--不应该因为数据库设置或数据导入而有任何延迟。因此在创建映像时必须导入数据库模式(DDL)和初始数据。
这可以通过dockerfile中的run
命令来实现,例如
RUN psql.exe -f initalize.sql -h myhost -d mydatabase -U myuser
RUN data-import.exe myhost mydatabase myuser
但是,AFAIU这将在Postgres容器内执行data-import.exe
,这只有在Postgres容器是Windows容器时才能工作。我们的产品使用Linux Postgres发行版,所以这不是一个好主意。我们需要该映像是一个Linux Postgres容器。
因此自然的解决方案是在主机上执行data-import.exe
,如下所示:
Docker Build
时,将启动Linux Postgres容器。运行psql.exe...
在Postgres容器中运行一些SQL命令。data-import.exe
在主机上执行。它的Postgres客户端连接到容器中的数据库并导入数据。有这样的命令吗?如果没有,我们如何在Docker中实现这个场景呢?
使用正确的工具,dockerfile并不是万能的锤子。
显然,您来自一个州,在使用导入工具之前,您已经发布了postgres。现在您可以通过启动一个postgres容器来模拟该策略(没有dockerfile,只有Docker/Kubernetes)。然后运行import-tool,停止postgres-container,并使用“docker commit”生成结果的快照。提交的映像将用于部署的下一阶段。