いろいろと詰まったので手順メモ
参考サイト
「Ubuntu 20.04 LTS に Docker をインストールする」
https://www.softek.co.jp/SID/support/sidfmvm/guide/install-docker-ubuntu2004.html
「【WSL2】Ubuntu 20.04でPID1をsystemdにする 2021年7月版」
https://shikiyura.com/2021/07/run_systemd_as_pid_1_on_wsl2_202107/
「CentOSにrbenv, Rubyをインストールする」
https://qiita.com/NaokiIshimura/items/ff04b6eaa40b33c4bea8
1.Ubuntuをインストール
まず管理者Powershellを開いて、以下のコマンドを実行
WSLのバージョンを2に設定します。
wsl --set-default-version 2
これをしておかないと後に「systemd is not supported under WSL 1」というエラーに悩まされることになります。
そのあと、Microsoft Storeで「Ubuntu」をインストール(いくつかあるけど、これで最新版がとれるみたい)
さらに、調べていて見つけたので「Windows Terminal」をインストール(必須ではない)
Ubuntuのターミナルを開いて、User/Passwordを設定したら次のステップへ
2.Dockerをインストール
2-1. Dockerのリポジトリを設定する
2-1-1.aptパッケージを更新
$ sudo apt update
2-1-2.必要パッケージをインストール
$ sudo apt install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
2-1-3.Docker公式のGPG公開鍵をインストール
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
2-1-4.fingerprint 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
であることを確認
sudo apt-key fingerprint 0EBFCD88
2-1-5.repositoryを追加
$ sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
2-2. Dockerの最新版をインストール
2-2-1.aptパッケージを更新
$ sudo apt update
2-2-2.最新版をインストール
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
2-2-3.動作確認
$ sudo docker run --rm hello-world
$ sudo docker rmi hello-world
2-3. systemdをPID 1で動かしてsystemctlを有効化する
確かこのあたりで以下のエラーに遭遇したので「genie」というツールを追加して対処
System has not been booted with systemd as init system (PID 1). Can't operate.
するのだが、これにはdotnet-runtime-5.0が必要(公式Git参照)とあるので先にインストールしておく。(後述する手順を変えれば不要かも)
Microsoftの公式サイトを参考に最新版(5.0に対応しているもの)をインストール
A. パッケージリポジトリを追加
wget https://packages.microsoft.com/config/ubuntu/21.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb
B. SDKのインストール
sudo apt-get update; \
sudo apt-get install -y apt-transport-https && \
sudo apt-get update && \
sudo apt-get install -y dotnet-sdk-5.0
C. ランタイムをインストールする
sudo apt-get update; \
sudo apt-get install -y apt-transport-https && \
sudo apt-get update && \
sudo apt-get install -y aspnetcore-runtime-5.0
D. SDKバージョン、ランタイムバージョンを確認する
dotnet --list-sdks
dotnet --list-runtimes
2-2-1. 導入のために必要なソフトをインストール
sudo apt install git dotnet-runtime-3.1 daemonize
※ここのdotnet-runtime-3.1を公式Gitに書いてあるバージョンに合わせればA-Dの手順は不要と思われる
2-2-1. genieをインストール
git clone https://github.com/arkane-systems/genie.git
cd genie
make install
2-2-2. genieを実行
genie -s
ps aux
systemdのPIDが1になれば成功!
2-3. Dockerイメージを取得
docker pull centos
2-3. Dockerコマンドの権限を変更
ここでdocker runコマンドをたたいたら、コンテナがExit(0)で起動しない問題が発生。
中にも入れず困り果てて、
sudo docker logs
dockerのログを見るとなにやら以下のエラーが
「Got permission denied while trying to connect to the Docker daemon socket」
dockeのsocketにアクセスできないとのこと。
今いるユーザーをdockerグループに追加して、
sudo gpasswd -a $(whoami) docker
socketファイルの所有グループを変更
sudo chgrp docker /var/run/docker.sock
dockerを再起動してあげたら治りました
sudo service docker restart
ついでに、sudoなしでdockerコマンドが叩けるようになりました。
2-3. Dockerコンテナを起動
docker run --name active-record -p 80:80 -v /mnt/z/share:/share -ti centos
3.Docker内にActiveRecord環境構築
3-1. 必要コマンド群インストール
必要なコマンドをインストールします。
yum -y install sudo
sudo yum -y install git
3-2. Rubyインストール
Rubyのインストールのためにrbenvをインストールします。
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
PATHを追加します。~/.bash_profileに以下の記述を追加。
# rbenv
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
反映
exec $SHELL --login
必要パッケージをインストール
sudo yum -y install bzip2 gcc openssl-devel readline-devel zlib-devel
バージョンを確認
bzip --version
bzip2 --version
gcc --version
yum list installed | grep openssl-deve
yum list installed | grep readline-dev
yum list installed | grep zlib-devel
makeをインストール(Rubyのインストールに必要なので)
sudo yum -y install make
Rubyをインストール
rbenv install --list
rbenv install 3.0.2
rbenv versions
rbenv global 3.0.2
ruby -v
sqlite-develをインストール
yum install sqlite-devel
sqlite3, activerecordをインストール
gem install sqlite3
gem install activerecord
環境構築は完了です。
docker内でtimedatectlを使ってタイムゾーンを設定しようとしたらまた以下のエラーが発生…
「genie」が同じ方法で入らなかったので現在調査中です。。。
System has not been booted with systemd as init system (PID 1). Can't operate.
[root@b01f6d2648d0 genie]# rm /usr/lib/systemd/system-environment-generators/80-genie-envar.sh
rm: remove symbolic link '/usr/lib/systemd/system-environment-generators/80-genie-envar.sh'? y
[root@b01f6d2648d0 genie]# rm /usr/local/bin/genie
rm: remove symbolic link '/usr/local/bin/genie'? y
[root@b01f6d2648d0 genie]# sudo make install-local
make -C package/local package
make[1]: Entering directory '/root/genie/package/local'
# Installing locally.
make -C binsrc build-local
make[2]: Entering directory '/root/genie/binsrc'
make -C genie local
make[3]: Entering directory '/root/genie/binsrc/genie'
dotnet publish -c ReleaseLocal -r linux-x64
Microsoft (R) Build Engine version 16.9.0+5e4b48a27 for .NET
Copyright (C) Microsoft Corporation. All rights reserved.
Determining projects to restore...
All projects are up-to-date for restore.
genie -> /root/genie/binsrc/genie/bin/ReleaseLocal/net5.0/linux-x64/genie.dll
genie -> /root/genie/binsrc/genie/bin/ReleaseLocal/net5.0/linux-x64/publish/
make[3]: Leaving directory '/root/genie/binsrc/genie'
make -C runinwsl
make[3]: Entering directory '/root/genie/binsrc/runinwsl'
dotnet publish -c Release -r linux-x64
Microsoft (R) Build Engine version 16.9.0+5e4b48a27 for .NET
Copyright (C) Microsoft Corporation. All rights reserved.
Determining projects to restore...
All projects are up-to-date for restore.
runinwsl -> /root/genie/binsrc/runinwsl/bin/Release/net5.0/linux-x64/runinwsl.dll
runinwsl -> /root/genie/binsrc/runinwsl/bin/Release/net5.0/linux-x64/publish/
make[3]: Leaving directory '/root/genie/binsrc/runinwsl'
make[2]: Leaving directory '/root/genie/binsrc'
# Just put the bits in the right places.
mkdir -p "/usr/local/bin"
# Binaries.
install -Dm 4755 -o root "binsrc/genie/bin/ReleaseLocal/net5.0/linux-x64/publish/genie" -t "/usr/local/libexec/genie"
install -Dm 0755 -o root "binsrc/runinwsl/bin/Release/net5.0/linux-x64/publish/runinwsl" -t "/usr/local/libexec/genie"
ln -s /usr/local/libexec/genie/genie /usr/local/bin/genie
# Environment generator.
install -Dm 0755 -o root "othersrc/scripts/80-genie-envar.sh" -t "/usr/local/libexec/genie"
ln -s /usr/local/libexec/genie/80-genie-envar.sh /usr/lib/systemd/system-environment-generators/80-genie-envar.sh
ln -s /usr/local/libexec/genie/80-genie-envar.sh /usr/lib/systemd/user-environment-generators/80-genie-envar.sh
ln: failed to create symbolic link '/usr/lib/systemd/user-environment-generators/80-genie-envar.sh': File exists
make[1]: *** [Makefile:31: package] Error 1
make[1]: Leaving directory '/root/genie/package/local'
make: *** [Makefile:54: install-local] Error 2
[root@b01f6d2648d0 genie]# rm /usr/local/bin/genie
rm: remove symbolic link '/usr/local/bin/genie'? y
[root@b01f6d2648d0 genie]# sudo make install-local
make -C package/local package
make[1]: Entering directory '/root/genie/package/local'
# Installing locally.
make -C binsrc build-local
make[2]: Entering directory '/root/genie/binsrc'
make -C genie local
make[3]: Entering directory '/root/genie/binsrc/genie'
dotnet publish -c ReleaseLocal -r linux-x64
Microsoft (R) Build Engine version 16.9.0+5e4b48a27 for .NET
Copyright (C) Microsoft Corporation. All rights reserved.
Determining projects to restore...
All projects are up-to-date for restore.
genie -> /root/genie/binsrc/genie/bin/ReleaseLocal/net5.0/linux-x64/genie.dll
genie -> /root/genie/binsrc/genie/bin/ReleaseLocal/net5.0/linux-x64/publish/
make[3]: Leaving directory '/root/genie/binsrc/genie'
make -C runinwsl
make[3]: Entering directory '/root/genie/binsrc/runinwsl'
dotnet publish -c Release -r linux-x64
Microsoft (R) Build Engine version 16.9.0+5e4b48a27 for .NET
Copyright (C) Microsoft Corporation. All rights reserved.
Determining projects to restore...
All projects are up-to-date for restore.
runinwsl -> /root/genie/binsrc/runinwsl/bin/Release/net5.0/linux-x64/runinwsl.dll
runinwsl -> /root/genie/binsrc/runinwsl/bin/Release/net5.0/linux-x64/publish/
make[3]: Leaving directory '/root/genie/binsrc/runinwsl'
make[2]: Leaving directory '/root/genie/binsrc'
# Just put the bits in the right places.
mkdir -p "/usr/local/bin"
# Binaries.
install -Dm 4755 -o root "binsrc/genie/bin/ReleaseLocal/net5.0/linux-x64/publish/genie" -t "/usr/local/libexec/genie"
install -Dm 0755 -o root "binsrc/runinwsl/bin/Release/net5.0/linux-x64/publish/runinwsl" -t "/usr/local/libexec/genie"
ln -s /usr/local/libexec/genie/genie /usr/local/bin/genie
# Environment generator.
install -Dm 0755 -o root "othersrc/scripts/80-genie-envar.sh" -t "/usr/local/libexec/genie"
ln -s /usr/local/libexec/genie/80-genie-envar.sh /usr/lib/systemd/system-environment-generators/80-genie-envar.sh
ln -s /usr/local/libexec/genie/80-genie-envar.sh /usr/lib/systemd/user-environment-generators/80-genie-envar.sh
ln: failed to create symbolic link '/usr/lib/systemd/user-environment-generators/80-genie-envar.sh': File exists
make[1]: *** [Makefile:31: package] Error 1
make[1]: Leaving directory '/root/genie/package/local'
make: *** [Makefile:54: install-local] Error 2
[root@b01f6d2648d0 genie]# rm /usr/lib/systemd/system-environment-generators/80-genie-envar.sh
rm: remove symbolic link '/usr/lib/systemd/system-environment-generators/80-genie-envar.sh'? y
[root@b01f6d2648d0 genie]# sudo make install-local
make -C package/local package
make[1]: Entering directory '/root/genie/package/local'
# Installing locally.
make -C binsrc build-local
make[2]: Entering directory '/root/genie/binsrc'
make -C genie local
make[3]: Entering directory '/root/genie/binsrc/genie'
dotnet publish -c ReleaseLocal -r linux-x64
Microsoft (R) Build Engine version 16.9.0+5e4b48a27 for .NET
Copyright (C) Microsoft Corporation. All rights reserved.
Determining projects to restore...
All projects are up-to-date for restore.
genie -> /root/genie/binsrc/genie/bin/ReleaseLocal/net5.0/linux-x64/genie.dll
genie -> /root/genie/binsrc/genie/bin/ReleaseLocal/net5.0/linux-x64/publish/
make[3]: Leaving directory '/root/genie/binsrc/genie'
make -C runinwsl
make[3]: Entering directory '/root/genie/binsrc/runinwsl'
dotnet publish -c Release -r linux-x64
Microsoft (R) Build Engine version 16.9.0+5e4b48a27 for .NET
Copyright (C) Microsoft Corporation. All rights reserved.
Determining projects to restore...
All projects are up-to-date for restore.
runinwsl -> /root/genie/binsrc/runinwsl/bin/Release/net5.0/linux-x64/runinwsl.dll
runinwsl -> /root/genie/binsrc/runinwsl/bin/Release/net5.0/linux-x64/publish/
make[3]: Leaving directory '/root/genie/binsrc/runinwsl'
make[2]: Leaving directory '/root/genie/binsrc'
# Just put the bits in the right places.
mkdir -p "/usr/local/bin"
# Binaries.
install -Dm 4755 -o root "binsrc/genie/bin/ReleaseLocal/net5.0/linux-x64/publish/genie" -t "/usr/local/libexec/genie"
install -Dm 0755 -o root "binsrc/runinwsl/bin/Release/net5.0/linux-x64/publish/runinwsl" -t "/usr/local/libexec/genie"
ln -s /usr/local/libexec/genie/genie /usr/local/bin/genie
ln: failed to create symbolic link '/usr/local/bin/genie': File exists
make[1]: *** [Makefile:27: package] Error 1
make[1]: Leaving directory '/root/genie/package/local'
make: *** [Makefile:54: install-local] Error 2
コメント
Great goods from you, man. I’ve understand your
stuff previous to and you’re just extremely excellent.
I really like what you’ve acquired here, really like what you’re stating and the way in which
you say it. You make it entertaining and you still care for to keep it wise.
I cant wait to read far more from you. This is really a terrific site.