jessie-backportsが削除された影響でDocker Buildに失敗するようになった話
DebianのBackports Packageが削除された。
海外でもいくつか話題になっている。
なぜ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のイメージは以下をベースに作成されている。
# # 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
buildpack-deps:jessie-curl
をさらにベースイメージを利用している。さらにベースイメージをたどる。
buildpack-deps:jessie-curl
debian:jessie
とりあえずここまで。
整理すると以下の通り
openjdk-8-jdk → buildpack-deps:jessie-scm → buildpack-deps:jessie-curl → debian:jessie
完全にjessieに依存している。
解決策はどうするか
そもそもjessieに依存するのがまずい。調べてみるとopenjdk-8-jdkのDockerfileが更新されている模様。
buildpack-deps:stretch-scm
stretchはdebin9。これならば恐らくしばらくは平気なはず。
まとめ
まさかOSの依存関係でDockerイメージのBuildが死ぬとは全く想定していなかったので今回は完全に不意打ちを食らった。
Dockerfileのベースイメージはきちんと把握しておこう。