忙しい人向けの結論
現在CircleCIでUbuntu 22.04のコンテナイメージをビルドする場合は、Remote Dockerの場合はバージョン20.10.12以降、Machine Executorの場合はubuntu-2204:2022.04.1以降を、明示的に指定して利用してください。
解説
2022年4月21日に、Ubuntuの最新長期サポート版となるUbuntu 22.04 LTS(以下jammy)がリリースされました。
早速アプリのコンテナを、jammyベースに変更しようとしている方も多いと思います。しかし2022年5月10日現在、CircleCI上でdocker build
を行うと、apt-getによるパッケージインストールに失敗するという問題があります。
サンプルとして、リポジトリに以下のDockerfileを用意しました。Ubuntu公式のjammyのイメージをベースに、helloパッケージをapt-getでインストールするだけのシンプルなものです。
FROM ubuntu:jammy RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y hello ENTRYPOINT /usr/bin/hello
.circleci/config.ymlは以下の通りです。setup_remote_docker
を実行してから、docker build
を行っているだけです。
version: 2.1 jobs: docker_build: docker: - image: cimg/base:2022.04 steps: - checkout - setup_remote_docker - run: name: Build application Docker image command: | docker build -t hello . workflows: my_workflow: jobs: - docker_build
すると以下のようなエラーが発生し、apt-getが失敗します。どうもリポジトリ鍵を読めず、署名を検証できていないように見えます。なおこの問題はCircleCI上でのみ発生し、ローカルでdocker build
を実行した場合は発生しません。
W: http://ports.ubuntu.com/ubuntu-ports/dists/jammy/InRelease: The key(s) in the keyring /etc/apt/trusted.gpg.d/ubuntu-keyring-2012-cdimage.gpg are ignored as the file is not readable by user '_apt' executing apt-key. W: http://ports.ubuntu.com/ubuntu-ports/dists/jammy/InRelease: The key(s) in the keyring /etc/apt/trusted.gpg.d/ubuntu-keyring-2018-archive.gpg are ignored as the file is not readable by user '_apt' executing apt-key. W: GPG error: http://ports.ubuntu.com/ubuntu-ports jammy InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 871920D1991BC93C E: The repository 'http://ports.ubuntu.com/ubuntu-ports jammy InRelease' is not signed. E: Sub-process returned an error code The command '/bin/sh -c apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y hello' returned a non-zero code: 100 Exited with code exit status 100 CircleCI received exit code 100
これは現在のCircleCIのRemote Dockerの、デフォルトに指定されているバージョンが古いことに起因する問題です。バージョン20.10.12を明示的に指定することで、この問題を回避できます。修正した.circleci/config.ymlを以下に抜粋します。
steps: - checkout - setup_remote_docker: version: 20.10.12
同様に、Machine Executorを使ってイメージをビルドする場合は、
jobs: machine_build: machine: image: ubuntu-2204:2022.04.1 steps: - checkout (...略...)
としてください。
以上、jammyを使ってCircleCIでハマったという小ネタでした。