com4dc’s blog

Javaプログラマーのはずだけど運用してます

jessie-backportsが削除された影響でDocker Buildに失敗するようになった話

DebianのBackports Packageが削除された。

gihyo.jp

lists.debian.org

海外でもいくつか話題になっている。

unix.stackexchange.com

なぜDocker Buildに失敗するのか

今回はまさにこれを踏んだ。

サポート終了コンポーネントのアーカイブ削除に寄せて · Forget me not...

SpringBootアプリケーションをDockerコンテナで稼働させている。

諸事情と歴史的経緯があって、AWS ElasticBeanstalk Dockerを利用している。1インスタンス1コンテナの単一コンテナ構成を採用している。

このサービスは、ECR等のDockerイメージリポジトリができる前に作られたものなので、作成したイメージを共有するという考えがそもそもない。

動作としては、コンテナの起動毎にDockerfileからDockerイメージを作成し、それを元にコンテナを立ち上げるという構成である。そのため、スケールアウトの度にDocker Buildが新たに立ち上がったEC2インスタンスの内部で実行されている状況である。

起動させるSpringBootアプリケーションのDockerイメージは、以下のDockerfileから作成している。

FROM java:openjdk-8-jdk
EXPOSE 8080
WORKDIR /opt/app/

RUN apt-get update && apt-get install -y zip jq
...

これをビルドすると以下のようなログが出力される。

openjdk-8-jdk: Pulling from library/java
Digest: sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66xxxxxxxx
Status: Image is up to date for java:openjdk-8-jdk
Successfully pulled java:openjdk-8-jdk
Sending build context to Docker daemon 50.61MB 
Step 1/8 : FROM java:openjdk-8-jdk
---> d23bdf5b1b1b
Step 2/8 : EXPOSE 8080
---> Using cache
---> 2bbd3fe4a821
Step 3/8 : WORKDIR /opt/app/
---> Using cache
---> b2e30df8c1fd
Step 4/8 : RUN apt-get update && apt-get install -y zip jq
---> Running in 543e2a760293
Get:1 http://security.debian.org jessie/updates InRelease [44.9 kB]
Ign http://deb.debian.org jessie InRelease
Get:2 http://deb.debian.org jessie-updates InRelease [145 kB]
Ign http://deb.debian.org jessie-backports InRelease
Get:3 http://deb.debian.org jessie Release.gpg [2420 B]
Ign http://deb.debian.org jessie-backports Release.gpg
Get:4 http://deb.debian.org jessie Release [148 kB]
Ign http://deb.debian.org jessie-backports Release
Get:5 http://security.debian.org jessie/updates/main amd64 Packages [822 kB]
Get:6 http://deb.debian.org jessie-updates/main amd64 Packages [20 B]
Get:7 http://deb.debian.org jessie/main amd64 Packages [9098 kB]
Err http://deb.debian.org jessie-backports/main amd64 Packages
Err http://deb.debian.org jessie-backports/main amd64 Packages
Err http://deb.debian.org jessie-backports/main amd64 Packages
404 Not Found
Fetched 10.3 MB in 6s (1694 kB/s)
[91mW: Failed to fetch http://deb.debian.org/debian/dists/jessie-backports/main/binary-amd64/Packages 404 Not Found
E: Some index files failed to download. They have been ignored, or old ones used instead.
[0mThe command '/bin/sh -c apt-get update && apt-get install -y zip jq' returned a non-zero code: 100
Failed to build Docker image aws_beanstalk/staging-app, retrying...
Sending build context to Docker daemon 50.61MB 
Step 1/8 : FROM java:openjdk-8-jdk
---> d23bdf5b1b1b
Step 2/8 : EXPOSE 8080
---> Using cache
---> 2bbd3fe4a821
Step 3/8 : WORKDIR /opt/app/
---> Using cache
---> b2e30df8c1fd
Step 4/8 : RUN apt-get update && apt-get install -y zip jq
---> Running in 8a9c791b9518
Get:1 http://security.debian.org jessie/updates InRelease [44.9 kB]
Ign http://deb.debian.org jessie InRelease
Get:2 http://deb.debian.org jessie-updates InRelease [145 kB]
Ign http://deb.debian.org jessie-backports InRelease
Get:3 http://deb.debian.org jessie Release.gpg [2420 B]
Ign http://deb.debian.org jessie-backports Release.gpg
Get:4 http://security.debian.org jessie/updates/main amd64 Packages [822 kB]
Get:5 http://deb.debian.org jessie Release [148 kB]
Ign http://deb.debian.org jessie-backports Release
Get:6 http://deb.debian.org jessie-updates/main amd64 Packages [20 B]
Err http://deb.debian.org jessie-backports/main amd64 Packages
Get:7 http://deb.debian.org jessie/main amd64 Packages [9098 kB]
Err http://deb.debian.org jessie-backports/main amd64 Packages
Err http://deb.debian.org jessie-backports/main amd64 Packages
Err http://deb.debian.org jessie-backports/main amd64 Packages
Err http://deb.debian.org jessie-backports/main amd64 Packages
404 Not Found
Fetched 10.3 MB in 6s (1676 kB/s)
[91mW: Failed to fetch http://deb.debian.org/debian/dists/jessie-backports/main/binary-amd64/Packages 404 Not Found
E: Some index files failed to download. They have been ignored, or old ones used instead.
[0mThe command '/bin/sh -c apt-get update && apt-get install -y zip jq' returned a non-zero code: 100
Failed to build Docker image aws_beanstalk/staging-app: y have been ignored, or old ones used instead.
[0mThe command '/bin/sh -c apt-get update && apt-get install -y zip jq' returned a non-zero code: 100. Check snapshot logs for details.
Process default has been draining for 17 seconds (Target.DeregistrationInProgress).

apt-get update && apt-get install -y zip jq を実行している際にエラーが発生している。 jessie-backports のパッケージが軒並み削除されており、Dockerイメージの作成が正常に行われていない。まあ、今どき http で取得しているところを見てもいろいろと思うところはある。

では、なぜなぜ今回のDebianのPackage削除がDocker Buildの失敗につながったかを調査した結果が以下である。

原因はベースイメージ

この FROM java:openjdk-8-jdk が大問題。Dockerfileの FROM をキーにベースイメージを辿っていく。

openjdk-8-jdk

通常のアプリケーションエンジニアはここくらいしか意識しないのではないだろうか。自分の使いたい環境のコンテナを立ち上げられれば良いのだから。あと調べることと言えば、Distributionくらいか。これによりパッケージマネージャのコマンド群が変化するため、ここは調べざるを得ない。

openjdk-8-jdkのイメージは以下をベースに作成されている。

github.com

#
# NOTE: THIS DOCKERFILE IS GENERATED VIA "update.sh"
#
# PLEASE DO NOT EDIT IT DIRECTLY.
#

FROM buildpack-deps:jessie-scm

buildpack-deps:jessie-scm をさらにベースイメージを利用している。さらにベースイメージをたどる。

buildpack-deps:jessie-scm

github.com

buildpack-deps:jessie-curl をさらにベースイメージを利用している。さらにベースイメージをたどる。

buildpack-deps:jessie-curl

github.com

debian:jessie とりあえずここまで。

整理すると以下の通り

openjdk-8-jdk → buildpack-deps:jessie-scm → buildpack-deps:jessie-curldebian:jessie

完全にjessieに依存している。

解決策はどうするか

そもそもjessieに依存するのがまずい。調べてみるとopenjdk-8-jdkのDockerfileが更新されている模様。

github.com

buildpack-deps:stretch-scm stretchはdebin9。これならば恐らくしばらくは平気なはず。

まとめ

まさかOSの依存関係でDockerイメージのBuildが死ぬとは全く想定していなかったので今回は完全に不意打ちを食らった。

Dockerfileのベースイメージはきちんと把握しておこう。