【環境構築】DockerでFortranを実行できる環境を作る

背景

  • 学生時代に研究で使っていたFortranをdockerで動かしてみたいと思った。
  • 学生時代、Fortranの環境構築で四苦八苦したので自分をdockerで救いたい。

目標

  • dockerでFortranを実行できる環境を作る。

Fotranとは?

前提環境

  • macOS 11.4 (20F71)
  • arm64(M1)

ファイル構成

docker_fortran_ubuntu
├─ Dockerfile           #どんな「docker images」を作るのか記載された設計図みたいなファイル
├─ docker-compose.yml   #「docker container」の起動コマンドをまとめたファイル
├─ hello.f90            #Fortranで「Hello World!」を表示するプログラム
└─ a.out                #Fortranでコンパイル時に生成される実行ファイル(生成されるファイルなので最初はないです)

ファイルの中身

FROM ubuntu:latest

RUN apt-get update && \
    apt-get install gfortran -y

WORKDIR /app
version: '3'

services:
  ubuntu_gfortran:
    restart: always
    build:
      context: .
      dockerfile: Dockerfile
    stdin_open: true
    tty: true
    volumes:
      - .:/app
program hello
  write(*, *) 'Hello World!'
end program hello

コンテナの起動からコンテナの中に入る

(1)ymlファイルからコンテナ起動

$docker-compose up -d --build

(2)コンテナの中に入る(buntu_gfortranの箇所はservice名に応じて変更する)

$docker-compose exec ubuntu_gfortran /bin/sh

コンテナ内部でFortranのコンパイルと実行

(1)「hello.f90」をgfortranでコンパイルし、実行ファイルを生成する。

$gfortran hello.f90

(2)実行ファイル「a.out」を実行する。

$./a.out

(3)「Hello World!」が表示されれば成功

ファイルの中身解説あり

#ベースイメージとしてubuntuを使用する
FROM ubuntu:latest

#gfortranをinstallする処理
#apt-get install gfortran -yの「-y」はinstallをするかどうかの質問にyesと答えるオプション
RUN apt-get update && \
    apt-get install gfortran -y

#docker内部のコマンド実行場所の指定
#今回はappディレクトリがないので、appディレクトリの作成も同時に行われる
WORKDIR /app
#docker-composeのファイルバージョンを指定
#ここでは「3」でバージョン3を指定している
version: '3'

services:
  #service名を指定
  #ここでは「ubuntu_gfortran」と指定している
  ubuntu_gfortran:
    #実行時に常に再起動するように指定
    #ここでは「always」で常に再起動を指定している
    restart: always
    #立ち上げの設定を指定
    build:
      #dockerfileの参照先を指定
      #ここでは「.」でカレントディレクトリを指定している
      context: .
      #使用するdockerfile名を指定
      #ここでは「Dockerfile」と指定している
      dockerfile: Dockerfile
    #標準入出力(ターミナル?)をコンテナと結びつける設定
    #ここでは「true」で結びつけている?
    stdin_open: true
    #キーボード入力をコンテナが受け付けるようにする設定
    #ここでは「true」で結びつけている?
    tty: true
    #dockerfileがあるカレントディレクトリとコンテナ内部のディレクトリをマウントする設定
    #ホスト側:コンテナ側 の順番で記載する
    #ここでは、ホスト側「.」でカレント:コンテナ側「/app」でappディレクトリとマウントしている
    volumes:
      - .:/app

補足

  • 本当は軽量イメージのalpineでやりたかったがうまくできなかった。
  • そのうち、githubにリポジトリも公開したい。
  • 使用される際は引用していただければ、ご自由にどうぞ。

参考資料

How to install a package with apt without the "Do you want to continue [Y/n]?" prompt?
Of course when you type: sudo apt-get install whatever It asks you: Do you want to continue ? Is there any way I can just install it without it asking me ...
ubuntu Tags | Docker Hub
Ubuntu is a Debian-based Linux operating system based on free software.
【プログラミング】Ubuntuにgfortranを導入してみる
Ubuntuにgfortranを導入してみる。
Packages for Linux and Unix
Fortran 入門: Fortran とは

Qiita記事

【環境構築】DockerでFortranを実行できる環境を作る - Qiita
背景学生時代に研究で使っていたFortranをdockerで動かしてみたいと思った。学生時代、Fortranの環境構築で四苦八苦したので自分をdockerで救いたい。目標dockerでFor…