Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails以外の開発一般

Dockerfile: 非推奨化されたapt-keyを置き換える

docker-composeでビルド中に以下のwarningが表示されているのに気づきました。

#5 65.11 Warning: apt-key output should not be parsed (stdout is not a terminal)

warning自体はさほど気にすることはなさそうです。

参考: Reduce Docker container build warnings

ついでにapt-keyについて調べてみると、apt-keyが非推奨化されていることを知りました。

以下は私が使っているDockerfileの抜粋です。PostgreSQLとYarnのインストールで使う認証キーを取得する部分でapt-keyが使われています。

# Dockerfile(抜粋)
RUN apt-get update -qq \
  && DEBIAN_FRONTEND=noninteractive apt-get install -yq --no-install-recommends \
    build-essential \
    gnupg2 \
    curl \
    less \
    git \
  && apt-get clean \
  && rm -rf /var/cache/apt/archives/* \
  && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \
  && truncate -s 0 /var/log/*log \
  && curl -sSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - \
  && echo 'deb http://apt.postgresql.org/pub/repos/apt/ buster-pgdg main' $PG_MAJOR > /etc/apt/sources.list.d/pgdg.list \
  && curl -sL https://deb.nodesource.com/setup_$NODE_MAJOR.x | bash - \
  && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
  && echo 'deb http://dl.yarnpkg.com/debian/ stable main' > /etc/apt/sources.list.d/yarn.list

なお、私のDockerfileやdocker-compose.ymlはEvil MartiansがRails開発用に公開しているものを元にしています。

evilmartians/terraforming-rails - GitHub

[旧版]クジラに乗ったRuby: Evil Martians流Docker+Ruby/Rails開発環境構築(翻訳)

apt-key非推奨化関連の情報

Ubuntuのmanページを見ると、apt-keyはたしかに非推奨化されています。

以下のフォーラムで、apt-keyを置き換える必要性について詳しく解説されています。ここを見る限りでは、apt-keyの代わりになるコマンドは公式には示されていないようです。

以下のブログでは、apt-key廃止の経緯などについてさらに詳しく解説されています。

同記事によると、apt-keyは単一の/etc/apt/trusted.gpgにキーを追加するが、リスクの異なるキーを同一ファイル内で共存させるべきではないというセキュリティ上の懸念から廃止が決まったそうです。なおapt-key2022年Q2で廃止が予定されています

既存のDockerfileでは急いで修正することもなさそうですが、今後Dockerfileを作るときのためにapt-keyを別のものに置き換えることにしました。

以下の記事では、apt-keyを置き換えるコマンド手順を解説しています。

Dockerfileで使われているapt-keyを置き換える記事がなかなか見当たらなかったので、自分で調べて置き換えました。

Dockerfileのapt-keyを置き換える

主に以下を参考にしました。

私のDockerfileには、PostgreSQLクライアントとYaml用のキー取得が記述されているので、どちらも置き換える必要があります。

試行錯誤の末、以下のようにテンプレートを作りました。以下は&&などを外していったんシェルの形にしています。ここではcurlを使っていますが、wgetでも構いません。

# 置き換え用テンプレート
curl -sSL キー取得元URL | gpg --dearmor -o /usr/share/keyrings/パッケージ名-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=キー取得元URL] debパッケージ取得元URL" オプション | tee /etc/apt/sources.list.d/パッケージ名.list > /dev/null
キー取得元URL
置き換え前のapt-keyと同じでよい。次の行のsigned-by=にも同じURLを指定する必要がある。
パッケージ名
1個目は生成するファイル名が重複しないためのものなので、重複しなければ何でもよいはず。2個目はパッケージ名にしないといけないと思う。
debパッケージ取得元URL
置き換え前のdebで指定されているものと同じでよい。
オプション
パッケージ取得元URLの構成に応じたオプションを指定する。
PostgreSQLの場合はディストリビューション名-pgdg main メジャーバージョン、Yarnの場合はstable mainなどとなる。

PostgreSQL

# 置き換え前
curl -sSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
echo 'deb http://apt.postgresql.org/pub/repos/apt/ buster-pgdg main' $PG_MAJOR > /etc/apt/sources.list.d/pgdg.list

上をテンプレートに沿って置き換えたものが以下です。

# 置き換え後
curl -sSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor -o /usr/share/keyrings/postgres-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/postgres-archive-keyring.gpg] https://apt.postgresql.org/pub/repos/apt/" bullseye-pgdg main $PG_MAJOR | tee /etc/apt/sources.list.d/postgres.list > /dev/null

本当はディストリビューション名(bullseye)を環境変数化したかったのですが、まだ方法がわかりません😢。

Yarn

# 置き換え前
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
echo 'deb http://dl.yarnpkg.com/debian/ stable main' > /etc/apt/sources.list.d/yarn.list

上をテンプレートに沿って置き換えたものが以下です。

# 置き換え後
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor -o /usr/share/keyrings/yarn-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/yarn-archive-keyring.gpg] https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list > /dev/null

更新後のDockerfile

以上を反映したのが以下のDockerfileです。これでapt-keyとおさらばできました。

# 更新後のDockerfile(抜粋)
RUN apt-get update -qq \
  && DEBIAN_FRONTEND=noninteractive apt-get install -yq --no-install-recommends \
    build-essential \
    gnupg2 \
    curl \
    less \
    git \
  && apt-get clean \
  && rm -rf /var/cache/apt/archives/* \
  && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \
  && truncate -s 0 /var/log/*log \
  && curl -sSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor -o /usr/share/keyrings/postgres-archive-keyring.gpg \
  && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/postgres-archive-keyring.gpg] https://apt.postgresql.org/pub/repos/apt/" bullseye-pgdg main $PG_MAJOR | tee /etc/apt/sources.list.d/postgres.list > /dev/null \
  && curl -sL https://deb.nodesource.com/setup_$NODE_MAJOR.x | bash - \
  && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor -o /usr/share/keyrings/yarn-archive-keyring.gpg \
  && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/yarn-archive-keyring.gpg] https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list > /dev/null

関連記事

docker-composeを便利にするツール「dip」を使ってみた

GitHub ActionsのイメージビルドをDockerレイヤキャッシュで高速化(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。