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開発用に公開しているものを元にしています。
apt-key
非推奨化関連の情報
Ubuntuのmanページを見ると、apt-key
はたしかに非推奨化されています。
以下のフォーラムで、apt-key
を置き換える必要性について詳しく解説されています。ここを見る限りでは、apt-key
の代わりになるコマンドは公式には示されていないようです。
以下のブログでは、apt-key
廃止の経緯などについてさらに詳しく解説されています。
同記事によると、apt-key
は単一の/etc/apt/trusted.gpg
にキーを追加するが、リスクの異なるキーを同一ファイル内で共存させるべきではないというセキュリティ上の懸念から廃止が決まったそうです。なおapt-key
は2022年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