sp-composer
是一项一次性服务,可将PHP Composer供应商卷构建为卷composer
;下载包需要几分钟。据我(部分)理解,同一作曲家/堆栈文件中的依赖服务不会等待RUN任务完成,因此它们以空的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
答案 0 :(得分:1)
我认为正确的方法是编辑依赖于PHP Composer容器的容器的Dockerfile,以便它们稍等一会儿再运行。
简单的解决方案是将睡眠添加到RUN命令(例如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是为您面临的问题而构建的。