我正在学习s6并且我已经到了想使用s6-log的程度。我有以下Dockerfile

FROM alpine:3.10

RUN apk --no-cache --update add s6

WORKDIR /run/service

COPY \
  ./rootfs/run \
  ./rootfs/app /run/service/

CMD ["s6-supervise", "."]

只是一个简单的脚本
#!/bin/sh

while true;
do
  sleep 1
  printf "Hello %s\n" "$(date)"
done

以及
#!/bin/execlineb -P
fdmove -c 2 1
s6-log -b n20 s1000000 t /var/log/app/
/run/service/app

为什么我总是
s6日志:致命:无法打开附加/run/service/app/lock:不是目录
? 没有./rootfs/app行,一切正常。

最佳答案

看来我做得不对。也就是说我应该用s6-svscan而不是s6-supervice
使用s6-svscan我可以在我的服务目录中创建log/子目录,以便我的应用程序的stdout被重定向到logger的stdin,如s6-svscan网站上所述:
对于它找到的每个新子目录dir,扫描器会在其上生成一个s6监控进程。如果存在DR/log,它会在DIR和DIR/log上产生S6监督过程,并将从不停止的管道从服务的STDUT保持到记录器的STDIN。
我写过这样的脚本:

#!/bin/execlineb -P
s6-log -b n20 s512 T /var/log/app

因此我将run更改为
CMD ["s6-svscan", "/run/"]

其中CMD包含我的服务的/run/service/脚本(不包含run调用)和s6-log子目录以及上面的log脚本。

10-04 12:19