GCP Dataflowでapt installが上手くいかない場合のトラブルシュート方法

GCPのCloud DataflowでのOS系のエラーが出た場合の調査方法の例です。

事象

yomon.hatenablog.com

こちらの記事で書いたようにJDBCを使ったジョブの、Apache Beamのバージョンを最新にしたら以下のようなエラーが発生するようになりました。

raise RuntimeError('Command %s failed: exit code: %s' % (command_list, p.returncode))
RuntimeError: Command ['sudo', 'apt', 'install', '--assume-yes', 'openjdk-8-jre'] failed: exit code: 100

調査

エラー内容

どうも以下のところでJavaをインストールした際に発生しているエラーのように見えます。

CUSTOM_COMMANDS = [
    ['sudo', 'apt-get', 'update'],
    ['sudo', 'apt-get', 'install', '--assume-yes', 'openjdk-8-jre'],
]

Dockerイメージを特定する

こういうOS系のエラーの時はDataflowのDockerイメージを見てみると調査が進みやすいです。

Dataflowで利用されているDockerイメージは、ログから gcr で検索すると以下のように見つけることができます。

f:id:yomon8:20201002194759p:plain

Checking docker image integrity of gcr.io/cloud-dataflow/v1beta3/python36:2.19.0

Dockerイメージを起動してみる

以下のようにイメージを起動してみます。

まずはエラーの発生していない、バージョンアップ前の 2.19.0 から確認します。

docker run -it --rm --entrypoint /bin/bash gcr.io/cloud-dataflow/v1beta3/python36:2.19.0

当然問題無くインストールできます。

root@4b413964f0ab:/# apt-get update && apt install --assume-yes openjdk-8-jre
root@4b413964f0ab:/# echo $?
0

次にエラーの発生している最新バージョン 2.24.0 で確認してみます。

docker run -it --rm --entrypoint /bin/bash gcr.io/cloud-dataflow/v1beta3/python36:2.24.0

openjdk-8-jre のパッケージが無くなっているらしい。beamのマイナーバージョンアップなのですが、DataflowのイメージのベースOSが stretch から buster に変わっているようです。 そしてexit codeも100なので、これで最初のエラーメッセージが特定できました。

root@6ffbb6df02cb:/# apt-get update && apt install --assume-yes openjdk-8-jre
#-- 省略
Reading state information... Done
E: Unable to locate package openjdk-8-jre
root@6ffbb6df02cb:/# echo $?
100

openjdk-11-jre なら存在するのでこちらを入れてみます。

今度は見たこと無いエラーが出ました。

root@c6ba957b3c70:/# apt-get update && apt install --assume-yes openjdk-11-jre
#--省略
dpkg: error processing package openjdk-11-jre-headless:amd64 (--configure):
 installed openjdk-11-jre-headless:amd64 package post-installation script subprocess returned error exit status 2
dpkg: dependency problems prevent configuration of openjdk-11-jre:amd64:
 openjdk-11-jre:amd64 depends on openjdk-11-jre-headless (= 11.0.8+10-1~deb10u1); however:
  Package openjdk-11-jre-headless:amd64 is not configured yet.

dpkg: error processing package openjdk-11-jre:amd64 (--configure):
 dependency problems - leaving unconfigured
dpkg: dependency problems prevent configuration of ca-certificates-java:
 ca-certificates-java depends on default-jre-headless | java8-runtime-headless; however:
  Package default-jre-headless is not installed.
  Package java8-runtime-headless is not installed.
  Package openjdk-11-jre-headless:amd64 which provides java8-runtime-headless is not configured yet.

dpkg: error processing package ca-certificates-java (--configure):
 dependency problems - leaving unconfigured
Processing triggers for libglib2.0-0:amd64 (2.58.3-2+deb10u2) ...
Processing triggers for libc-bin (2.28-10) ...
Processing triggers for systemd (241-7~deb10u4) ...
Processing triggers for ca-certificates (20200601~deb10u1) ...
Updating certificates in /etc/ssl/certs...
0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
Setting up glib-networking:amd64 (2.58.0-2+deb10u2) ...
Setting up libsoup2.4-1:amd64 (2.64.2-2) ...
Setting up libsoup-gnome2.4-1:amd64 (2.64.2-2) ...
Setting up librest-0.7-0:amd64 (0.8.1-1) ...
Setting up libgtk-3-0:amd64 (3.24.5-1) ...
Setting up libgtk-3-bin (3.24.5-1) ...
Setting up libatk-wrapper-java-jni:amd64 (0.33.3-22) ...
Processing triggers for libgdk-pixbuf2.0-0:amd64 (2.38.1+dfsg-1) ...
Processing triggers for libc-bin (2.28-10) ...
Errors were encountered while processing:
 openjdk-11-jre-headless:amd64
 openjdk-11-jre:amd64
 ca-certificates-java
E: Sub-process /usr/bin/dpkg returned an error code (1)
root@c6ba957b3c70:/#

原因はこちらに書いてありました。

stackoverflow.com

/usr/share/man/man1 のディレクトリを事前に作ると解消するようです。

以下のコマンドで上手くいくことが確認できました。

mkdir -p /usr/share/man/man1
apt update && apt install -y openjdk-11-jre

修正

ということで、以下のようにman1ディレクトリを作成し、JREを11に上げることで今回は解消しました。

CUSTOM_COMMANDS = [
    ["sudo", "mkdir", "-p", "/usr/share/man/man1"],
    ["sudo", "apt", "update"],
    ["sudo", "apt", "install", "-y", "openjdk-11-jre"],
]

まとめ

DataflowのOS系のエラーが出た場合は、Dockerコンテナを特定してローカルで確認すると効率良く調査できます。