GCPのCloud DataflowでのOS系のエラーが出た場合の調査方法の例です。
事象
こちらの記事で書いたように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
で検索すると以下のように見つけることができます。
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:/#
原因はこちらに書いてありました。
/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コンテナを特定してローカルで確認すると効率良く調査できます。