とことんDevOps | 日本仮想化技術が提供するDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けするとことんDevOpsでは、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果など、DevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、アジャイル開発、コンテナ開発など

開催予定の勉強会

各種SNSのフォローもよろしくお願いいたします。

CircleCIでUbuntu 22.04ベースのコンテナをビルドすると、apt-getが失敗する問題

忙しい人向けの結論

現在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でハマったという小ネタでした。