如何使用OpenRC(Alpine)在Docker中自动启动服务?
问题描述:
我使用iron.io的阿尔卑斯风味。我想在Docker镜像启动时自动运行一个简单的'闪烁'脚本作为服务。 (我想要派生的图像,使用这个作为基础,不知道/关心这项服务 - 它只是“继承”并运行。)我正在使用S6这个,并且运行良好,但想看看是否阿尔派已经内置的东西可以开箱即用。如何使用OpenRC(Alpine)在Docker中自动启动服务?
我Dockerfile:
FROM iron/scala
ADD blinkin /bin/
ADD blink /etc/init.d/
RUN rc-update add blink default
我的服务脚本:
#!/sbin/openrc-run
command="/bin/blinkin"
depend()
{
need localmount
}
的/ bin中/ blinkin脚本:
#!/bin/bash
for I in $(seq 1 5);
do
echo "BLINK!"
sleep 1
done
所以我建立泊坞窗图像并运行它。我看不到任何输出(闪烁!...)我的脚本在/ bin中,我可以运行它,并且工作正常。我的blink脚本位于/etc/init.d,并且符号链接到/ etc/runlevels/default。所以一切看起来好吧,但它似乎并没有运行任何东西。
如果我尝试:'rc-service blink start',我看不到“闪烁!” outbut,但得到这个:
* WARNING: blink is already starting
我在做什么错?
答
在主命令启动之前,您可能会发现我的dockerfy
实用程序有用的启动服务,预运行初始化命令。见https://github.com/markriggins/dockerfy
例如:
RUN wget https://github.com/markriggins/dockerfy/releases/download/0.2.4/dockerfy-linux-amd64-0.2.4.tar.gz; \
tar -C /usr/local/bin -xvzf dockerfy-linux-amd64-*tar.gz; \
rm dockerfy-linux-amd64-*tar.gz;
ENTRYPOINT dockerfy
COMMAND --start bash -c "while true; do echo BLINK; sleep 1; done" -- \
--reap -- \
nginx
将运行bash脚本作为一种服务,呼应每秒闪烁一次,而主命令nginx
运行。如果nginx退出,那么BLINK服务将自动停止。
作为一个额外的好处,nginx遗留的任何僵尸进程将被自动清理。
您还可以跟踪日志文件,如/var/log/nginx/error.log到stderr,之前编辑的nginx的配置来启动和更
你是如何引导你的容器?在你的Dockerfile中既没有'CMD'也没有'ENTRYPOINT',所以默认情况下没有一个明确的命令就不会发生。你期望什么启动openrc init系统? – larsks
我通常只是码头运行.../bin/bash。是否有一个CMD启动OpenRC?我假设(错误地?)它本身开始为pid 1或其他东西。 – Greg
您的命令(在本例中为“/ bin/bash”)为您的容器的PID 1。如果你希望你的容器运行一个init系统,你需要安排在容器启动时运行'/ sbin/init'。我不认为openrc在集装箱化环境(它需要特权)中运行良好,但s6工作得很好。 – larsks