4
2

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-08-30

背景

  • 学生時代に研究で使っていた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でコンパイル時に生成される実行ファイル(生成されるファイルなので最初はないです)

ファイルの中身

Dockerfile
FROM ubuntu:latest

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

WORKDIR /app
docker-compose.yml
version: '3'

services:
  ubuntu_gfortran:
    restart: always
    build:
      context: .
      dockerfile: Dockerfile
    stdin_open: true
    tty: true
    volumes:
      - .:/app
hello.f90
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!」が表示されれば成功

ファイルの中身解説あり

Dockerfile
#ベースイメージとして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.yml
#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にリポジトリも公開したい。
  • 使用される際は引用していただければ、ご自由にどうぞ。

参考資料

個人ブログ

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2