Pi4でBuildxしてみたとその問題点
目次
Pi4のDocker buildx buildするまで、そこで分かった問題点について記述しています。
要点
マルチアーキテクチャビルドはPi4でもできるのだけど、別アーキテクチャ(AMD64とか)はqemuを使う関係上、処理時間的に長くなる。
結果、外部からtgz等を落としてくる処理がタイムアウトして、ビルドが失敗してしまう場合がある。
はっきりしていないところ
AMD64についてはビルド時期をずらすとかできたら問題は解消するパターンもあるはず。
Docker buildxするまで
環境:
- Pi4
- RaspberryPiOS
- Docker
- 19.03.9
Docker clientで試験機能を有効化
.docker/config.json
{
"hoge":"...",
"experimental": "enabled"
}
Docker daemonで試験機能を有効化
/etc/docker/daemon.json
/etc/docker/daemon.json
{
"experimental": true
}
sudo systemctl restart docker
確認
$ docker version
Client: Docker Engine - Community
Version: 19.03.13
API version: 1.40
Go version: go1.13.15
Git commit: 4484c46
Built: Wed Sep 16 17:03:56 2020
OS/Arch: linux/arm64
Experimental: true ←☆ここ
Server: Docker Engine - Community
Engine:
Version: 19.03.9
API version: 1.40 (minimum version 1.12)
Go version: go1.13.10
Git commit: 9d98839
Built: Fri May 15 00:24:36 2020
OS/Arch: linux/arm64
Experimental: true ←☆ここ
containerd:
Version: 1.3.7
GitCommit: 8fba4e9a7d01810a393d5d25a3621dc101981175
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version: 0.18.0
GitCommit: fec3683
docker buildx
docker buildx create
docker buildx create --use --name builder
独自認証局証明利用の独自リポジトリ対応
自身のサーバーでは、自分で認証局を構築してリポジトリがそのサーバー証明書を使用しているため、下記の通り対応。
docker buildx inspect --bootstrap builder
BUILDER=$(docker ps | grep buildkitd | cut -f1 -d' ')
docker cp intermediate.crt $BUILDER:/usr/local/share/ca-certificates/
docker exec $BUILDER update-ca-certificates
docker restart $BUILDER
この辺分からなかったとき/etc/docker/certs.d/registry.localdomain/ca.crtやらintermediates.crtやらおいてもダメでね。
結論は、サーバー証明書を発行した認証局の証明書をbuildxのインスタンスに対し、証明書を配置して更新するしかない。(もしかしたら試験機能から新しくなったら上記ディレクトリを参照しに行くとかあるかもしれないけど)
docker buildx build
cd docker/python
docker buildx build -t registry.localdomain/ansible --platform linux/amd64,linux/arm64,linux/arm/v7 --push .
問題のあったDockerfile
前述した問題が露見したのはこれです。
FROM python:alpine
RUN apk --no-cache add --virtual .builddeps tzdata gcc libc-dev libffi-dev openssl-dev
RUN apk --no-cache add openssh-client && \
cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ JST-9
ENV TERM xterm
RUN pip install --upgrade pip && \
pip install --upgrade setuptools && \
pip install --upgrade ansible ←☆ここ
RUN apk del .builddeps
RUN adduser -D ansible && \
echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \
echo 'ansible:ansible' | chpasswd && \
mkdir /key && chown ansible:nobody /key && \
mkdir /home/ansible/.ssh && \
chown ansible:nobody /home/ansible/.ssh
Pi4で実行したさい、connection reset by peerが連発したので、諦めて、手元のノートパソコンをうならせてビルドしました。
最後に
今思えば、上記以外のイメージビルドでも、HUGOのビルドの時にメモリが足りなかった系のエラーが出てたりもしてました。
ビルドサーバーを格安で仕上げたいので、Pi4たちに頑張ってほしいのですが、その目的は達成できるのかできないのか。
分かったらまた何か記事上げるとします。