動機
windows10 homeにwsl2でdockerを導入して、ついでにdocker-composeも積むことで最高の開発環境を作ろうとしたのだが、一度電源を落とすとログオンの度に手動で daemon
くんを起動し直さなければならないことに気づいた。docker-compose.yml
で restart:always
している関係上、できればWin10が再起動してしまってもログオンすればすぐに daemon
くんには起きていてほしい……!
TL; DR
cf. Docker Running Seamlessly in Windows Subsystem Linux
1. sudo vi /usr/local/sbin/start_docker.sh
/usr/local/sbin/start_docker.sh#!/usr/bin/env bash # The first command will setup cgroups mounts on the subsystem # (this only needs to be done once per reboot), and the second # will bring up the docker service using systemd. sudo cgroupfs-mount sudo service docker start
2. 実行権限を付与する
$ sudo chmod +x /usr/local/sbin/start_docker.sh # Lock down edit privileges $ sudo chmod 755 /usr/local/sbin/start_docker.sh
3. sudo vi /etc/sudoers
- 最下部に以下の項目を追記
/etc/sudoers# Enable docker services to start without sudo yourUserName ALL=(ALL:ALL) NOPASSWD: /bin/sh /usr/local/sbin/start_docker.sh
4. タスクスケジューラでログオン時にwsl上のdockerを起動
- 全般
- 「最上位の特権で実行する」にチェック
- トリガー
- ログイン時 かつ 少し時間差を持って起動する
- 同時にやると意図せず事故るかもしれないので
- 操作
- プログラム:
C:\Windows\System32\bash.exe
- 引数の追加:
-c "sudo /bin/sh /usr/local/sbin/start_docker.sh"
- プログラム:
- 条件
- 「AC電源に~」のチェックを外す
- 設定
- お好みで
5. 再起動してログオンし直したあと、sudo service docker status
で動作を確認
$ sudo service docker status * Docker is running
私的解釈(自己中心的な解説)
1.sudo vi /usr/local/sbin/start_docker.sh
start_docker.sh
というシェルスクリプトを /usr/local/sbin
というディレクトリに置いている。書き込みにはroot権限が必要なことに注意したい。vi で開くと読み込み限定になっているため、:w !sudo tee %
すればよさそう?(エディタ初心者並感)
2.実行権限を付与する
chmod
コマンドを使用して、/usr/local/sbin/start_docker.sh
の権限を変更している。オプションに +x
を用いているので、"eXecution" を追加したことになる。これをただ単に付与するだけじゃなくて、対象ごとに数字で指定するやり方が chmod OOO
ということになる。
この操作により、/usr/local/sbin
に置かれているスクリプトをシステム側から実行できるようになる。
3.sudo vi /etc/sudoers
/etc/sudoers
には sudo
周りのあれこれが設定されている(実行可能ユーザとかコマンドとか)。このファイルへの変更は即座に反映されるため、:w !sudo tee %
する前に誤字脱字等がないか念入りに確認すること(二敗)。もしミスすると、sudo
が使えません → 設定ファイルにエラーがあります!となって詰む。
もしそうなってしまったら、パスワードを再設定し直すときと同様に、powershell
か cmd.exe
から wsl -u root
してrootログインする解決法がある(sudo無しで /etc/sudoers
を変更できるユーザであるrootくんに頼んで修正する)
4.タスクスケジューラでログオン時にwsl上のdockerを起動
おまけ
実は /usr/local/sbin/start_docker.sh
の内容はdocker起動コマンドに限らずどんなものであれ実行できる(たとえば service
に登録してあるものなど、常に sudo
が必要なものすべて)。インタラクティブ実行にならないように注意しつつ、ssh
や cron
などをここに追記しておくことで、ほとんど普通のサーバーと変わりない振る舞いをさせることができる。
上記の工程それぞれでファイル名を /usr/local/sbin/WSL_autostart.sh
などと変更して、そのファイルに適宜必要なコマンドを追記していくといいだろう。