我正在学习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
行,一切正常。
所以看来我做错了。即我应该使用s6-svscan
而不是s6-supervice
。使用s6-svscan
,我可以在服务目录中创建s6-svscan
子目录,以便将我的应用程序的stdout重定向到记录器的stdin,如在log/
的网站上所述:
对于找到的每个新的子目录目录,扫描程序都会在其上生成一个s6-supervise进程。如果dir / log存在,它将在dir和dir / log上都产生一个s6-supervise进程,并维护从服务的stdout到记录器的stdin的永不关闭的管道。
我已经这样写了s6-svscan
脚本:
run
并因此将#!/bin/execlineb -P
s6-log -b n20 s512 T /var/log/app
更改为
CMD
其中CMD ["s6-svscan", "/run/"]
包含用于我的服务的/run/service/
脚本(无run
调用)和具有上述s6-log
脚本的log
子目录。