2016-02-29 914 views
3

我使用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 

我在做什么错?

+0

你是如何引导你的容器?在你的Dockerfile中既没有'CMD'也没有'ENTRYPOINT',所以默认情况下没有一个明确的命令就不会发生。你期望什么启动openrc init系统? – larsks

+1

我通常只是码头运行.../bin/bash。是否有一个CMD启动OpenRC?我假设(错误地?)它本身开始为pid 1或其他东西。 – Greg

+1

您的命令(在本例中为“/ bin/bash”)为您的容器的PID 1。如果你希望你的容器运行一个init系统,你需要安排在容器启动时运行'/ sbin/init'。我不认为openrc在集装箱化环境(它需要特权)中运行良好,但s6工作得很好。 – larsks

回答

1

在主命令启动之前,您可能会发现我的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的配置来启动和更

相关问题