Docker で Intel Fortran 実行環境を構築する

DockerFortran

cover image from Unsplash

Photo by Mason Jones on Unsplash

本記事について

Docker を活用して Fortran 環境を簡単にセットアップし、コンパイルと実行を行う方法を紹介する。

ディレクトリ構成

.
├── Dockerfile
├── Makefile
└── hello.f90

ファイルの内容

Hello, World!するだけのプログラムでテストする。

program hello
  implicit none
  write(*, *) 'Hello, World!'
end program hello
FC = ifort
 
hello: hello.f90
 $(FC) -o hello hello.f90

Intel から oneAPI の公式 Docker イメージintel/oneapi-hpckitが提供されているので、これを利用する。

FROM intel/oneapi-hpckit:2023.0.0-devel-ubuntu20.04
 
RUN apt-get update \
 && apt-get install -y --no-install-recommends make
 
COPY . .
RUN make
 
CMD ["./hello"]

コンテナのビルドと実行

ifort-helloという名前でイメージを作成する。
intel/oneapi-hpckitイメージの pull に結構時間かかります

docker build -t ifort-hello .

コンテナの起動。./helloが実行される。

$ docker run --rm ifort-hello
Hello, World!

これで OK。

コンテナの軽量化

上記で作成したイメージはなんと 17GB もあるので、マルチステージビルドを利用して軽量化する。

コンパイルはintel/oneapi-hpckitイメージで行い、実行ファイルと必要なライブラリだけをubuntu:20.04イメージにコピーする。

FROM intel/oneapi-hpckit:2023.0.0-devel-ubuntu20.04 as build
 
RUN apt-get update \
 && apt-get install -y --no-install-recommends make
 
COPY . .
RUN make
 
 
FROM ubuntu:20.04
 
COPY --from=build /opt/intel/oneapi/mpi/2021.8.0 /opt/intel/oneapi/mpi/2021.8.0
COPY --from=build /opt/intel/oneapi/compiler/2023.0.0 /opt/intel/oneapi/compiler/2023.0.0
ENV LD_LIBRARY_PATH="/opt/intel/oneapi/compiler/2023.0.0/linux/compiler/lib/intel64_lin:$LD_LIBRARY_PATH"
 
COPY --from=build ./hello ./hello
 
CMD ["./hello"]

コンテナのビルドと起動のコマンドは同じ。

作成されたイメージのサイズを確認してみる。

$ docker image ls
REPOSITORY         (略)       SIZE
ifort-hello-slim   (略)        4.86GB
ifort-hello        (略)        17.3GB

ifort-hello-slimがマルチステージビルドを利用した場合のイメージ。
マルチステージビルドを利用することで、10GB 以上もサイズを削減できた。