我正在学习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", "."]
./rootfs/app
只是一个简单的sh
脚本
#!/bin/sh
while true;
do
sleep 1
printf "Hello %s\n" "$(date)"
done
和run
是
#!/bin/execlineb -P
fdmove -c 2 1
s6-log -b n20 s1000000 t /var/log/app/
/run/service/app
为什么我会不断得到
s6-log:致命:无法打开_append / run / service / app / lock:不是目录
?没有s6-log
行,一切正常。
答案 0 :(得分:0)
所以看来我做错了。也就是说,我应该使用s6-svscan
而不是s6-supervice
。
使用s6-svscan
,我可以在服务目录中创建一个log/
子目录,以便将我应用的标准输出重定向到记录器的标准输入,如s6-svscan
的网站所述:
对于找到的每个新子目录,扫描程序都会在其上生成一个s6-supervise进程。如果dir / log存在,它将在dir和dir / log上都产生一个s6-supervise进程,并维护从服务的stdout到记录器的stdin的永不关闭的管道。
我已经这样写了run
脚本:
#!/bin/execlineb -P
s6-log -b n20 s512 T /var/log/app
为此,我将CMD
更改为
CMD ["s6-svscan", "/run/"]
其中/run/service/
包含我的服务的run
脚本(没有进行s6-log
调用)和上面带有log
脚本的run
子目录。