g00ceyの技術ブログ

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たちに頑張ってほしいのですが、その目的は達成できるのかできないのか。
分かったらまた何か記事上げるとします。


Share

comments powered by Disqus