Digdag/Embulkと任意のバージョンのPythonを両立させたDockerイメージを作成する方法
datatech-jp Advent Calendar 2023 の4日目の記事です。
本記事では、 Digdag / Embulk と、任意のバージョンの Python の両方をインストールした Docker イメージを作成する方法について解説します。
想定する要件
- Python の Docker 公式イメージ以外のイメージをベースにする
- Digdag と Embulk を使うため、Java 8 が必要になる
- そのため、ベースイメージに
eclipse-temurin:8-jre-jammy
を使いたい- Java 以外でも、特定のイメージをベースとして使いたいケースに応用できる
- 最新バージョンの Python を使う
- 今回は、(2023/11/13 現在)最新の stable バージョンである Python 3.12.0 を利用することを想定する
- 最新バージョンはパッケージ管理ツール(apt や yum など)ではインストールできない
- ワークフローエンジンの実行とジョブの実行でイメージは分けない
- 今回は、小規模なワークフローを組むことを想定する
- 大規模なワークフローを組む場合や、今後別のワークフローエンジンへの移行を想定している場合、ジョブを実行するイメージは分けておいた方がメンテナンス性は高まるが、今回は考慮しない
なお、上記のような事情がない場合には、よりシンプルに以下のどちらかを採用することをおすすめします。
- Python の Docker 公式イメージをベースイメージとして利用する
- パッケージ管理ツールを使って Python をインストールする
Docker イメージ作成の手順
Dockerfile の作成
まずは Dockerfile
を以下の内容で作成します。
FROM eclipse-temurin:8-jre-jammy
# バージョン指定
ARG PYTHON_VERSION="3.12.0"
ARG DIGDAG_VERSION="0.10.5"
ARG EMBULK_VERSION="0.11.0"
# 必要なパッケージをインストール
RUN apt-get update -y && \
apt-get upgrade -y && \
apt-get install -y --no-install-recommends \
build-essential \
gdb \
lcov \
pkg-config \
libbz2-dev \
libffi-dev \
libgdbm-dev \
libgdbm-compat-dev \
liblzma-dev \
libncurses5-dev \
libreadline6-dev \
libsqlite3-dev \
libssl-dev \
lzma \
lzma-dev \
tk-dev \
uuid-dev \
zlib1g-dev \
wget && \
rm -rf /var/lib/apt/lists/*
# 特定のバージョンのPythonのソースをダウンロードし、ビルドしてインストール
RUN wget --no-check-certificate https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tgz && \
tar -xf Python-${PYTHON_VERSION-version}.tgz && \
cd Python-${PYTHON_VERSION} && \
./configure --enable-optimizations && \
make && \
make install && \
cd .. && \
rm -f Python-${PYTHON_VERSION}.tgz
# Digdagをダウンロード
RUN wget --no-check-certificate -O /usr/local/bin/digdag "https://dl.digdag.io/digdag-${DIGDAG_VERSION}" && \
chmod +x /usr/local/bin/digdag
# Embulkをダウンロード
RUN wget --no-check-certificate -O /usr/local/bin/embulk "https://dl.embulk.org/embulk-${EMBULK_VERSION}.jar" && \
chmod +x /usr/local/bin/embulk
Dockerfile についての補足
- Python のインストールにあたり、公式の Python 開発者ガイドを参考にし、すべてのモジュールをビルドできるように依存パッケージをインストールしています。もし不要なものがあれば適宜除外してください。
- ベースイメージを Debian 系 OS 以外のものに変更する場合、apt コマンドが使えないので適宜書き換えてください。
Docker イメージのビルド
Dockerfile
があるディレクトリで以下のコマンドを実行し、イメージをビルドします。
$ docker image build . -t kazaneya/java-python:3.12.0
インストール結果の確認
ビルドが完了したら、以下のコマンドを実行し、指定したバージョンの Python、Digadg、Embulk がそれぞれインストールされていることを確認します。
$ docker container run --rm -it kazaneya/java-python:3.12.0 bash
$ python3 -V
Python 3.12.0
$ digdag --version
0.10.5
$ embulk --version 2>dev/null | head -n1
Embulk 0.11.0
まとめ
本記事では、Java の Docker イメージに Python をソースからビルドしてインストールすることで、Digdag や Embulk と任意のバージョンの Python を共存させる方法についてご紹介しました。
もし、Python の Docker 公式イメージの利用や、パッケージ管理ツールによる Python インストールでは要件が満たせないような状況に遭遇してお困りの際は、ぜひ試してみてください。