背景
Docker コンテナ上でPerlを動かし、メモリを節約したかった。
注意: 本記事はパフォーマンスレポートではありません。
構成
次の構成のコンテナを作成する。
- docker
- alpine-linux
- H2O
- fcgiwrapper (via tcp)
- supervisord
ポイント
- 各種デーモンはrootで起動して、デーモン内でsetuid等を行う(fcgiwrapperを除く)
- fcgiwrapper は unix socket ではなく、tcp 通信を行う
- 起動時にユーザー(fcgiwrapper)のチェックを行うため、そのままでは起動できない
- H2Oからソケットを参照するときに同一ユーザーじゃないとエラーとなる
- fcgiwrapper の起動前にソケットを削除しなくてはならない(この操作はTCPの場合不要)
- 各種ファイル(cgi)は /var/www/html へ配置
- 配置したファイルは必ず所有者をwww-dataとすること
各種コード
- Dockerfile
- entrypoint.sh
- h2o.conf
- supervisord.conf
Dockerfile.
FROM alpine:latest
USER root
RUN apk add -U --no-cache \
fcgi fcgiwrap perl \
h2o supervisor sudo
COPY supervisord.conf \
h2o.conf \
entrypoint.sh \
/tmp/
RUN set -ex \
&& adduser -S -H -G www-data -u 82 www-data \
&& mv /tmp/supervisord.conf /tmp/h2o.conf /etc/ \
&& chmod 644 /etc/supervisord.conf /etc/h2o.conf \
&& mv /tmp/entrypoint.sh /etc/ \
&& chmod +x /etc/entrypoint.sh \
&& mkdir -p /var/www/html \
&& chown -R www-data:www-data /var/www/html
# Put entry point to execute
ENTRYPOINT ["/etc/entrypoint.sh"]
EXPOSE 80
# Startup supervisor
CMD ["supervisord", "-c", "/etc/supervisord.conf"]
entrypoint.sh
#!/bin/sh
exec $@
h2o.conf
pid-file: /tmp/h2o.pid
access-log: /dev/stdout
error-log: /dev/stderr
user: www-data
file.custom-handler:
extension: [ .pl, .cgi ]
fastcgi.connect:
port: 9000
type: tcp
compress: on
file.index: [ 'index.html', 'index.htm', 'index.txt', 'index.pl' ]
hosts:
"local:80":
listen:
port: 80
host: 0.0.0.0
paths:
"/":
file.dir: /var/www/html
supervisord.conf
[supervisord]
nodaemon=true
loglevel=info
user=root
logfile=/dev/null
logfile_maxbytes=0
pidfile=/tmp/supervisord.pid
[program:fcgiwapper]
command=/usr/bin/fcgiwrap -c 3 -s tcp:127.0.0.1:9000
autorestart=true
user=fcgiwrap
group=www-data
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
priority=100
[program:h2o]
command=/usr/bin/h2o -c /etc/h2o.conf
autorestart=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
startsecs=3
priority=200