4 minute read

風音屋 データエンジニアの濱田(@hrkhjp)です。

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 など)ではインストールできない
  • ワークフローエンジンの実行とジョブの実行でイメージは分けない
    • 今回は、小規模なワークフローを組むことを想定する
    • 大規模なワークフローを組む場合や、今後別のワークフローエンジンへの移行を想定している場合、ジョブを実行するイメージは分けておいた方がメンテナンス性は高まるが、今回は考慮しない

なお、上記のような事情がない場合には、よりシンプルに以下のどちらかを採用することをおすすめします。

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 インストールでは要件が満たせないような状況に遭遇してお困りの際は、ぜひ試してみてください。