概要
s6-overlayを使用しているDockerイメージに対し機能を追加しようとしましたが、ハマって結構な時間を取られたので、動いたコードと試したことを共有します。
必要事項
s6-overlayでサービスを動かすために、以下のことは最低限必要です。
- runファイルの作成
- typeファイルの作成
-
/etc/s6-overlay/s6-rc.d/
配下にrunファイル、typeファイルを配置 -
/etc/s6-overlay/s6-rc.d/user/contents.d/
配下に上記で追加したサービス名のファイルを配置
runファイルの作成
#!/usr/bin/execlineb -P
socat tcp-listen:8080,fork,reuseaddr tcp-connect:abehiroshi.la.coocan.jp:80
サービスを実行するためのコマンドを記載します。一番上の行は、alpine系のs6-overlayのイメージで使用するようです。(参考)他のディストリビューションの場合は不明。
#!/usr/bin/with-contenv sh
socat tcp-listen:${SOCAT_LISTENPORT},fork,reuseaddr tcp-connect:${SOCAT_CONNECTHOST}:${SOCAT_CONNECTPORT}
環境変数を使用する場合は、一番上の行が#!/usr/bin/with-contenv sh
になるようです。(参考)
typeファイルの作成
longrun
初期処理に使用するスクリプト(oneshot)か、サービスとして動かすものか(longrun)を指定します。今回はサービスとして動かすため、longrunを指定します。
runファイル、typeファイルを配置
/etc/s6-overlay/s6-rc.d/
に任意のサービス名(今回はsocat-1
)でディレクトリを作成し、ディレクトリ内に上記で作成したrunファイルとtypeファイルを配置します。
contents.d配下にサービス名のファイルを配置
/etc/s6-overlay/s6-rc.d/user/contents.d/
内に、上記で作成したディレクトリ名のファイル(今回はsocat-1
)を作成します。中身は空です。
動いたコード
FROM linuxserver/wireguard:latest
# socatをインストール
RUN apk add --no-cache socat
# s6-overlayで動くように処理を追加
RUN mkdir /etc/s6-overlay/s6-rc.d/socat-1 && \
(echo '#!/usr/bin/execlineb -P'; \
echo 'socat tcp-listen:8080,fork,reuseaddr tcp-connect:abehiroshi.la.coocan.jp:80'; \
) >> /etc/s6-overlay/s6-rc.d/socat-1/run && \
echo "longrun" >> /etc/s6-overlay/s6-rc.d/socat-1/type && \
touch /etc/s6-overlay/s6-rc.d/user/contents.d/socat-1
# ポート開放
EXPOSE 8080/tcp
s6-overlayを使用していたlinuxserver/wireguard
のイメージに対し、socatサービスを使用してポートフォワーディングができるようにします。
8080ポートにアクセスすると、阿部寛のホームページにポートフォワードする設定としています。(動かすと、404 Not FoundでNifty側から返却されますが、ポートフォワードできていることは確認できるので問題なし)
設定ファイルをCOPY
コマンドで持ってくるやり方が一般的なような気もしますが、今回は面倒でしたのでDockerFile上でファイルを作成してしまいました。
その他試したこと
chmod の有無
実行可能権限がないとエラーとなるという文献がネット上にありましたが、今回の環境ではchmodがなくても実行できました。
感想
分かればそんなに難しくありませんが、s6-overlay自体がバージョン2以前とバージョン3で記載方法が異なっているというのもあり、情報を拾い出すのに苦労しました。ほとんど英語の文献しかなかったため、内容は少ないですが少しでも本記事が助けになりましたら幸いです。
参考文献