技術関連の覚書

案件でやったり自宅で試したことの覚書

dockerのubuntuイメージでsystemctlを動かす

本来やるべきではないのですが、せっかくやったのでとりあえず残しておきます。

自前のサービスをDockerで動かすときの書き方

/etc/systemd/hoge.service を作成したあと

# systemctl enable hoge
# systemctl daemon-reload
# systemctl start hoge

という手順でサービスを動かす。

dockerの場合、色々と制限がかかっているため、そのままではsystemctlが動きません。

それを取り除く必要があります。 ちょうどSELinuxをdisableにするような感じになります。

docker run のときに --privileged オプションをつけて /sbin/init を実行することで制限が外れ/sbin/initが動くようになり、systemctlを実行できるようになります。

ほぼすべての制限を外してしまうので、部分的に制限を外したい場合は--device=/dev/xxx を使うほうが良いです。

$ docker run --rm --privileged -it -name hoge hogehoge:latest /sbin/init
## これと別に
$ docker exec -it hoge bash
入ったコンテナ# systemctl start service

と言うように実行するか、 ENTRYPOINTで /sbin/init && systemctl start service を実行できるようなシェルを起動させる

FROM ubuntu

COPY hoge.service /etc/systemd/
RUN systemctl enable hoge

COPY entrypoint.sh /usr/bin
ENTRYPOINT ["/usr/bin/entrypoint.sh"]
#!/bin/bash
exec /sbin/init
systemctl  daemon-reload
systemctl start hoge