Open14

コンテナベースの開発環境構築

星野 仁星野 仁

Dockerで各プロジェクトの開発環境を管理してみる。

  • ホストPCのVSC上で編集&デバグ
  • プロジェクトはGitで管理
  • Python仮想環境はコンテナ上に構築
  • Gitへのコミットでコンテナを自動生成
  • コンテナ生成後にテストを自動実行
  • ドキュメントをコードから自動生成(これは別タスクかな)
星野 仁星野 仁

Dockerコンテナリポジトリ

  • Docker Hub
  • Amazon Elastic Container Registry (AWS ECR)
  • Azure Container Registry
  • Google Container Registry
星野 仁星野 仁

GitHub Actions を登録 .github/workflows/docker-image.yml

Dockerfileを作成して実行する。

DOCKER_NAME は リポジトリ変数、DOCKER_PASSWORD はリポジトリシークレットに定義

step間の変数は $GITHUB_ENV に登録することでやりとり

星野 仁星野 仁

Mac上でmicropythonのコンテナを作成すると、/ports/unix での make test で

...
2 tests failed: float_parse float_parse_doubleprec
make: *** [Makefile:267: test_full] Error 1

のエラーになってしまう。

テスト結果 tests/results/* を参照すると浮動小数点演算で若干の差がでてしまう模様。
以下を参照するとFPUのハードウェア挙動による差がでているのか?

関連: https://github.com/micropython/micropython/issues/4176

星野 仁星野 仁

$GITHUB_REPOSITORY_OWNER は ${{ github.repository_owner }} と記載するのが正解。
$GITHUB_REPOSITORY は owner/repository の値に展開される。

QEMUによる arm64 の git clone が時間がかかり過ぎる。
→ 事前にビルド用のコンテナ内に clone して各 platform にコピーしてみる

micropython プロジェクトを git の submodule にして clone 時に recursive で取り込む。

デバイスの容量不足で停止してしまった。
git clone だと容量が足りるのに COPYだとだめなのはなぜだろう??

System.IO.IOException: No space left on device : '/home/runner/runners/2.309.0/_diag/Worker_20230913-095304-utc.log'
...

ベースにしている Runner の容量がオーバーしたのが原因。
下記を参考に容量を削減することで実行できるようになった。

https://zenn.dev/pinto0309/scraps/c6413eb15a1b2a

星野 仁星野 仁

Dockerfile の記述注意(自分的にハマった点の備忘録)

  1. ディレクトリCOPY

わかっている人には当たり前だけど、COPY でのディレクトリコピーは以下に注意

# 意図通りのコピー
COPY hoge/ dst/hoge
# NGになる例
COPY hoge/ dst/
  1. RUNの可視性向けにヒアドキュメント使う?

ヒアドキュメントは bash の機能で、公式の推奨記述 にはRUNの記述例として載っていないのであまり使いたくないけど、たしかにメンテナンスはし易い。

Dockerfile の RUN は sh なので、以下のように bash で実行するように置き換える。

RUN bash <<EOS
echo "AAAA"
source tool/ci.sh
call_func
EOS
星野 仁星野 仁

GitHub Packages への登録で 403 エラーになってしまう問題にハマった。

アクセス権の設定箇所が漏れていた

  • オーナー(組織または個人)の権限
  • アクションの権限
  • パッケージに対するリポジトリの権限

最後のが漏れていて数日悩んでしまった。

公式のドキュメントは以下にあった。
https://docs.github.com/ja/packages/learn-github-packages/configuring-a-packages-access-control-and-visibility#ensuring-workflow-access-to-your-package

星野 仁星野 仁

上記をクリアしたら今度はイメージの pull で docker: manifest unknown. のエラーに。

どうもCacheが悪さをしていた模様。

原因はまだ調査中。

星野 仁星野 仁

VSCの開発環境でMS提供のイメージを使うとIISが入っているが必要なのか?

Azure連携がメリットのようだが、当面不要なのでまずはDockerの公式コンテナなどを利用して環境を構築することにする。