0

我有容器 A,它依赖于容器 B 下载的数据。

为了实现这种依赖,我尝试在 docker-compose 中使用depends_on,虽然它确保容器B在A之前启动,但下载可能仍在进行中。

有没有办法在容器 A 的入口点中指定一个条件,它必须等到容器 B 完成下载?

4

2 回答 2

2

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

Kubernetes:如果是 Kubernetes,那你就走运了,你描述的基本都是init container。Kubernetes 中的一个 pod 可以有多个容器,并且 init 容器在主应用程序容器启动之前运行完成。以下是最新版本的文档状态:

它们在任何应用容器启动之前运行完成,而应用容器并行运行,因此 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必须出现在两个容器中的相同位置)。

于 2019-06-17T17:56:51.393 回答
1

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

由于两个容器都使用相同的数据,它们将指向某个公共目录或挂载点。

完成下载操作后在containerB中。创建一些将标记此过程完成的事件,例如触摸文件 /path/xyz.txt

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

于 2019-06-17T17:55:12.530 回答