我的容器A取决于容器B下载的数据。
要实现此依赖关系,我尝试在docker-compose中使用depends_on,尽管它确保容器B在A之前启动,但下载可能仍在进行中。
是否有一种方法可以在容器A的入口点中指定条件,该条件必须等待容器B完成下载?
答案 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是否存在,如果存在,则将继续进行操作。