PHP Composer 和其他 Docker 服务启动顺序问题

PHP Composer & other Docker services start-up sequence problem

sp-composer 是一项一次性服务,可将 PHP Composer 供应商卷构建成卷 composer;下载软件包需要几分钟时间。正如我(部分)理解的那样,同一个 composer/stack 文件中的依赖服务不会等待 运行 任务完成,因此它们以一个空的 composer 卷启动并且它们从不随后看到它已填充(出于某种原因)。

当前的解决方法是在生产启动序列中休眠 8 秒,将 Swarm 堆栈文件拆分为一个仅用于 Composer,另一个用于其余部分。有时我们需要增加延迟。这当然很糟糕,应该修复。

有很多关于使用运行状况检查来延迟基于网络服务(例如数据库)等依赖性的服务的帖子,但 sp-composer 是一个刚刚运行然后退出的服务。

我们只需要延迟序列的其余部分开始,直到 sp-composer 退出。我突然想到docker wait(应该?)解决了一半的问题,但我们仍然需要将堆栈文件分成两部分,并且两次docker stack deploy.

目前解决这种情况的最佳做法是什么?

作为参考,这是有问题的 Dockerfile:

FROM php:7.1
RUN apt-get update \
    && DEBIAN_FRONTEND=noninteractive \
    && apt-get install -y libxml2-dev zlib1g-dev \
    && docker-php-ext-install soap zip
COPY . /composer
WORKDIR /composer
RUN php ./composer.phar install --no-dev --no-interaction --optimize-autoloader

我认为正确的方法是编辑依赖于 PHP Composer 容器的容器的 Dockerfile,以便它们在 运行.

之前稍等片刻

简单的解决方案是将睡眠添加到 运行 命令(例如 RUN sleep 5s; entrypoint.sh)。

更简洁的解决方案是在入口点脚本中定期验证卷是否已正确填充。类似于:

$VOLUME_POPULATED = false
while [[ $VOLUME_POPULATED != true ]]
do
# check if volume is populated
sleep 5s
done

# execute rest of command

无论使用哪种方法,您都不需要两个 Swarm 文件,因为构建容器是为了等待先决条件完成。

此外,如果您愿意尝试其他编排工具,我建议您尝试一下 Kubernetes,因为它实际上是容器编排的标准。特别是,init containers 是针对您所面临的问题而构建的。