Docker容器依赖性

时间:2019-06-17 17:36:07

标签: docker docker-entrypoint

我的容器A取决于容器B下载的数据。

要实现此依赖关系,我尝试在docker-compose中使用depends_on,尽管它确保容器B在A之前启动,但下载可能仍在进行中。

是否有一种方法可以在容器A的入口点中指定条件,该条件必须等待容器B完成下载?

2 个答案:

答案 0 :(得分:2)

这基本上取决于您的执行环境。

Kubernetes :如果是Kubernetes,那么您很幸运,您所描述的基本上是init container。 Kubernetes中的Pod可以具有多个容器,并且在启动主应用程序容器之前,初始化容器要运行完毕。这是最新版本的文档状态:

  

它们在任何应用容器启动之前就运行完毕,而应用   容器并行运行,因此Init容器提供了一种简便的方法   阻止或延迟应用容器的启动,直到某些   满足先决条件。

Docker Compose :您不太幸运。正如您的问题所指出的,depends_on仅仅意味着一个容器在另一个容器之前被启动,而不是它在另一个容器开始之前被完成。如果要实现这一目标,则需要将逻辑放在自己身上。

在这种情况下,我将让下载容器下载所需的内容,然后将其写入已知的位置。

例如在下载容器的入口点脚本中:

#!/bin/bash
curl -o /path/to/my/download http://example.com/download/path
touch /some/shared/file

并在主容器的入口点内:

#!/bin/bash
while [ ! -f /some/shared/file ]; do
# endless loop
done

# now perform your normal start

这假定/path/to/my/download/some/shared/file都可以通过卷安装或共享数据容器从两个容器访问(特别是/some/shared/file必须出现在同一位置)在两个容器中)。

答案 1 :(得分:1)

我建议对containerA入口点进行更改。

由于两个容器都使用相同的数据,因此它们将指向某个公用目录或安装点。

完成下载操作后,在containerB中

。创建一些事件来标记此过程的完成,例如触摸文件/path/xyz.txt

在containerA入口点脚本中,它将继续检查文件/path/xyz.txt是否存在,如果存在,则将继续进行操作。