【问题标题】:How can I auto-start a service in Docker using OpenRC (Alpine)?如何使用 OpenRC (Alpine) 在 Docker 中自动启动服务?
【发布时间】:2016-06-13 05:16:36
【问题描述】:

我使用的是来自 iron.io 的阿尔卑斯风味。我想在 Docker 映像启动时自动运行一个简单的“闪烁”脚本作为服务。 (我希望以此为基础的衍生图像不知道/关心此服务——它只是被“继承”并运行。)我为此使用 S6,效果很好,但想看看是否Alpine 中已经内置的东西可以开箱即用。

我的 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

所以我构建了 Docker 映像并运行它。我看不到任何输出(闪烁!...) 我的脚本在 /bin 中,我可以运行它,并且可以运行。我的眨眼脚本在 /etc/init.d 中并符号链接到 /etc/runlevels/default。所以一切看起来都不错,但似乎没有运行任何东西。

如果我尝试:'rc-service blink start' 我看不到“BLINK!” outbut,但一定要明白这一点:

 * WARNING: blink is already starting

我做错了什么?

【问题讨论】:

  • 你是如何启动你的容器的? Dockerfile 中既没有CMD 也没有ENTRYPOINT,因此默认情况下,如果没有明确的命令,什么都不会发生。您希望启动 openrc init 系统是什么?
  • 我通常只是 docker run ... /bin/bash.是否有启动 OpenRC 的 cmd?我假设(错误地?)它本身以 pid 1 或其他形式开始。
  • 您的命令(在这种情况下为/bin/bash)是容器的 PID 1。如果你想让你的容器运行一个初始化系统,你需要安排在容器启动时运行/sbin/init。我不认为 openrc 在容器化环境中运行良好(它需要特权),但 s6 运行良好。
  • 我担心你可能是对的。我更改为: ENTRYPOINT["/sbin/init","/bin/bash"] 并且它运行 init 很好,但它很快就因许多与权限相关的错误而窒息(即使我设置了 USER root 也是如此)。我希望它可以开箱即用,因为 OpenRC 是随 iron.io 映像一起安装的,但似乎不是。回S6那我去!
  • @andilabs 最好的解决方案是不在容器内运行进程管理器。如果要运行多个服务,请使用多个容器。如果您有更多问题,最好的办法是发布一个问题,因为这里的 cmets 并不是真正进行扩展讨论的地方。

标签: docker alpine


【解决方案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 脚本作为服务运行,每秒回显 BLINK,同时主命令 nginx 运行。如果 nginx 退出,则 BLINK 服务将自动停止。

另外一个好处是,任何被 nginx 遗留下来的僵尸进程都会被自动清理掉。

您还可以将 /var/log/nginx/error.log 等日志文件拖尾到 stderr,在启动之前编辑 nginx 的配置等等

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-22
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 2013-08-05
    • 2020-11-28
    • 2023-03-14
    相关资源
    最近更新 更多