使Docker映像作为另一个映像的基础

时间:2019-03-25 11:50:50

标签: docker dockerfile

现在,我已经构建了一个简单的GET API来访问此数据库:https://github.com/ghusta/docker-postgres-world-db

此API将获取国家/地区代码,并从数据库中获取该国家/地区的完整记录。

结构是该API位于单独的docker映像中,而数据库位于另一个docker映像中。

因此,一旦API映像尝试启动,我就需要它先启动数据库映像,然后再在数据库映像上运行自身。

那怎么办?

2 个答案:

答案 0 :(得分:2)

您可以使用Docker Compose,特别是depends_on指令。这将导致Docker在启动映像之前启动所有依赖项。

不幸的是,在启动任何依赖项之前,没有办法让它等待依赖项上线。您必须使用等待脚本或类似脚本自行管理。

答案 1 :(得分:2)

最可能的解决方案是将docker compose与第三方脚本一起使用。

例如,您的docker撰写文件可能如下所示:

services:
  web:
    build: .
    ports:
      - "80:8000"
    depends_on:
      - "db"
    command: ["./wait-for-it.sh", "db:5432", "--", "python", "app.py"]
  db:
    image: postgres 

./wait-for-it.sh是可以从

获得的第三方脚本

https://github.com/vishnubob/wait-for-it

您也可以从以下位置使用此脚本

https://github.com/Eficode/wait-for

如果您愿意(我愿意),我建议根据您的需要调整脚本。

PS:

例如,等待数据库准备就绪的问题实际上只是分布式系统更大问题的一部分。在生产中,您的数据库可能随时不可用或移动主机。您的应用程序需要能够应对这些类型的故障。

要解决此问题,请设计您的应用程序以尝试在失败后重新建立与数据库的连接。如果应用程序重试连接,则最终可以连接到数据库。

最好的解决方案是在启动时以及由于某种原因导致连接断开时都在应用程序代码中执行此检查