経緯
先日作成した Docker Desktop for Windows で動作する Raspberry Pi OS のコンテナを使っていくつか検証してみます。
まずは軽量な Git サーバである gogs をインストールして動作確認するところまでやってみたいと思います。
手順
手順としては以下の記事をなぞったものとなります。
> docker run --name googseberrypi -p 10300:3000 --privileged -it raspios-bullseye-armhf64-lite:2023-05-03 /bin/bash
先日作成したイメージからコンテナを起動。最終的にホスト側から git push して試験したいのでポートも開けておきます。
# apt update -y
# apt upgrade -y
# apt install -y wget sudo zip git
apt
のアップデート・アップグレードと必要なパッケージのインストールを実行します。
# mkdir /var/gogs
# cd /var/gogs/
作業用ディレクトリを作成して移動します。
# wget https://dl.gogs.io/0.13.0/gogs_0.13.0_linux_armv7.zip
# unzip gogs_0.13.0_linux_armv7.zip
# adduser --disabled-login --gecos 'Go Git Service' git
# chown -R git:git /var/gogs/
# sudo -H -u git mkdir /home/git/gogs
https://dl.gogs.io/
から最新の Gogs をダウンロードして展開します。なお、今回作成したイメージでは QEMU との対応からか gogs_0.13.0_linux_armv8.zip
では動きませんでした(「(参考・没) armv8 の実行結果」を参照)。
# su git
/var/gogs $ ./gogs/gogs web
yyyy/mm/dd hh:ii:ss [ WARN] Custom config "/var/gogs/gogs/custom/conf/app.ini" not found. Ignore this warning if you're running for the first time
yyyy/mm/dd hh:ii:ss [TRACE] Log mode: Console (Trace)
yyyy/mm/dd hh:ii:ss [ INFO] Gogs 0.13.0
yyyy/mm/dd hh:ii:ss [TRACE] Work directory: /var/gogs/gogs
yyyy/mm/dd hh:ii:ss [TRACE] Custom path: /var/gogs/gogs/custom
yyyy/mm/dd hh:ii:ss [TRACE] Custom config: /var/gogs/gogs/custom/conf/app.ini
yyyy/mm/dd hh:ii:ss [TRACE] Log path: /var/gogs/gogs/log
yyyy/mm/dd hh:ii:ss [TRACE] Build time: 2023-02-25 02:45:33 UTC
yyyy/mm/dd hh:ii:ss [TRACE] Build commit: 8c21874c00b6100d46b662f65baeb40647442f42
yyyy/mm/dd hh:ii:ss [ INFO] Run mode: Development
yyyy/mm/dd hh:ii:ss [ INFO] Available on http://localhost:3000/
いったん先程作成した git
ユーザで実行ファイルを叩いて実行します(理由は後述)。
今回は Docker 上なので http://localhost:3000/
ではなく、ポートも冒頭のポートに合わせて http://localhost:10300/
にアクセスします。
Gogs の初期設定画面を開くことができたので、パラメータを調整していきます。変更した部分だけ以下に記載します。
- データベースの種類: SQLite3
- 仮に実機で本番運用するとしてもそこまで大規模になるとも想定していないですし、現時点ではただの検証環境なのでお手軽な SQLite で済ませます
- リポジトリのルートパス:
/home/git/gogs/gogs-repositories
- 上述のコマンドで作成したディレクトリに合わせます
- 実行ユーザ: git
- これはこの設定画面上ではデフォルトから変えていないですが、変えていないがゆえに先程実行ファイルを叩く際に
root
のままで叩くと実行ユーザが異なるためここでエラーになります。かといってroot
で実行したくはないので、こちらの設定はgit
のままですが、逆に先程いったんユーザをgit
に切り替えて実行ファイルを叩く、という手順を踏みました
- これはこの設定画面上ではデフォルトから変えていないですが、変えていないがゆえに先程実行ファイルを叩く際に
- ドメイン: 一応仮想環境の中で
ip a
で出てきたIPの値に合わせます - アプリケーションのURL: こちらもドメインと同様
- Default Branch: 初期値
master
でしたがここは一応main
にしておきます
これで「Gogs をインストール」ボタンをクリックしてインストールを実行します。ただし、このボタンをクリックすると先程の「アプリケーションのURL」に対してリダイレクトがかかりますが、今回はホスト側からアクセスできるIPもポートも設定した値とは異なるのでページが見付からない状態になります。
そのため、手動でもう一度 http://localhost:10300/
にアクセスします。
URLを開き直すとダッシュボード画面が表示され、インストールが完了したことが確認できます。
右上の「登録」から新規ユーザを作成します。
必要項目を入力して登録。
今入力したID・パスワードでサインインします。
サインインできました。試しに「自分のリポジトリ」の右の「+」アイコンで一つ新規のリポジトリを作ってみます。
リポジトリ名を入力して作成。
空っぽのリポジトリができました。
後はホスト側(開発マシン)からリモートリポジトリとしてこのリポジトリを設定して push してみます。
push できました。基本的な部分では一通り動作していることが確認できたので、検証成功です。
(参考・没) armv8 の実行結果
# wget https://dl.gogs.io/0.13.0/gogs_0.13.0_linux_armv8.zip
# unzip gogs_0.13.0_linux_armv8.zip
# chown -R git:git /var/gogs/
# su git
/var/gogs $ ./gogs/gogs web
qemu-aarch64: Could not open '/lib/ld-linux-aarch64.so.1': No such file or directory
/var/gogs $
ダメだった手順
参照した記事では systemctl
を使用していた (実機前提と思われる) ため、 Docker コンテナ上で systemctl
を使用できないか試しましたが、 /sbin/init
実行でエマージェンシーモードに入っていそうな感じ (ただし SSH で入ると普通に操作できる) でした。
一応別ターミナル画面で最後の sudo systemctl start gogs.service
まで叩いてみましたが、暫く待たされた後にジョブキャンセルされてしまったので没となりました。
> docker run --name googseberrypi -p 10300:3000 --privileged -it raspios-bullseye-armhf64-lite:2023-05-03 /sbin/init
systemctl
を使うために --privileged
オプションで権限を付与しつつ /sbin/init
を起動しつつコンテナを建てます。
> docker container exec -it googseberrypi /bin/bash
コンテナに入ります。
# apt update -y
# apt upgrade -y
# apt install -y wget sudo zip git
# mkdir /var/gogs
# cd /var/gogs/
# wget https://dl.gogs.io/0.13.0/gogs_0.13.0_linux_armv8.zip
# unzip gogs_0.13.0_linux_armv8.zip
# adduser --disabled-login --gecos 'Go Git Service' git
# chown -R git:git /var/gogs/
# sudo -H -u git mkdir /home/git/gogs
ここまでは成功した手順と同じです。
# vi gogs/scripts/systemd/gogs.service
[Unit]
Description=Gogs
After=syslog.target
After=network.target
#After=mariadb.service mysql.service mysqld.service postgresql.service memcached.service redis.service
# ↑の行をコメントアウトする
[Service]
# Modify these two values and uncomment them if you have
# repos with lots of files and get an HTTP error 500 because
# of that
###
#LimitMEMLOCK=infinity
#LimitNOFILE=65535
Type=simple
User=git
Group=git
WorkingDirectory=/home/git/gogs
#ExecStart=/home/git/gogs/gogs web
ExecStart=/var/gogs/gogs web
# ExecStart のパスを gogs を展開したパスに変更する
## 略
# sudo systemctl enable /var/gogs/gogs/scripts/systemd/gogs.service
# sudo systemctl start gogs.service
# ↑ここでジョブキャンセルされて実行できない
systemctl
で操作するため設定ファイル gogs/scripts/systemd/gogs.service
を編集し、サービスを登録・起動の流れです。
ただし、最後の起動のところで起動失敗してしまい、没となりました (後で気付いたのですが環境的に gogs_0.13.0_linux_armv7.zip
ならば行けたかもしれません)。