Windows10 Home + WSL2(Ubuntu) + Docker + Visual Studio Codeの環境で簡単にCOBOL開発を始めるための手順

自宅で気軽にCOBOL開発と勉強をするため、また職場の若者にCOBOLを教えるため、簡単に開発着手できる方法を模索していました。

今までは別記事で書いたようにWindows10上のWSL2環境にUbuntuをインストールし、そこに直接GnuCOBOLをインストールするやり方でやっていましたが、既に別の用途でUbuntuを使っているから環境を汚したくないとわがままありがたいご指摘を頂いてしまいました。

そこで色々考えたり調べたりした結果、Dockerでコンテナを作ってその上で開発しちゃえばいいじゃん!という結論になりました。

WSL2の導入までは別記事に記載済みなので省略するとして、DockerはDocker Desktop for Windowsをインストールします。

Dockerのインストール方法は公式サイトを見るのが良いと思います。基本インストーラーをどんどん進めていくだけだった気が・・・

気を付けるのは、[Configuration]ページで[ Enable Hyper-V Windows Features]または[Install required Windows components for WSL 2]オプションが選択されていることを確認するくらいですね。

ちゃんとWSL2が入っていればチェックが入っているはずです。

Visual Studio Codeも公式ページからダウンロードしてインストーラーを実行し、使用できるようにしておきます。

ローカルで一度起動したら、日本語言語パックの『Japanese Language Pack for Visual Studio Code』とWSL2との連携に使用する『Remote - WSL』と『Remote - Containers』の拡張機能をあらかじめインストールしておきます。


ここまでの準備が終わって前提の環境がそろったら、COBOLの開発環境の導入に入ります。

まず、開発用の任意のフォルダをWSL2のUbuntu上に作ります。そして、COBOLコンテナ作成のためのDockerfileを作成します。

~/my-app$ mkdir ./cobol
~/my-app$ cd ./cobol/
~/my-app/cobol$ nano Dockerfile

Dockerfileには以下のように記載します。

ベースとなるイメージはDebian 10 (buster)のDocker公式buildpack-depsを使用します。

# Debian 10 (buster) のベースイメージを取得
FROM buildpack-deps:buster

# パッケージのアップデートとopen-cobol(GnuCOBOL)のインストール
RUN apt-get update && apt-get install -y open-cobol

作成し終わったら、そのフォルダからVisual Studio Codeを起動します。

~/my-app/cobol$ code .

Visual Studio Codeを起動したら、以下のような画面になっていると思います。

Visual Studio Codeを起動後の画面

①エクスプローラーはWSL:UBUNTU上のフォルダになっていて、Dockerfileが表示されている。
②左下を見ると、WSL:Ubuntuに接続されている。

続いてコンテナを作成します。左下の緑色のところをクリックしてコンテナへ接続します。

コンテナの作成と接続

①中央にコマンドパレットが出てくるので、Reopen in Containerを選択する。
②最初はコンテナがないので更に選択肢が出てくる。『From 'Dockerfile'』を選択する。
③あらかじめ作成しておいたDockerfileを元に、コンテナが作成されるのでしばらく待つ。

コンテナが作成し終わったら、自動的にコンテナの環境を参照するようになります。

しかもこのやり方で環境を作成した場合(ここが肝なのですが)フォルダは元のWSL2上のフォルダと共有しています。

コンテナに接続された後の状態

①コンテナ環境に接続されるとエクスプローラーはCOBOL[DEV CONTAINER:EXISTING DOCKERFILE]と表示が変わる。フォルダそのものはWSL:UBUNTU上のフォルダと共有されている。
②左下を見ると、Dev Container: Existing Dockerfileとなっており、コンテナに接続されていることがわかる。
ターミナルもコンテナ上のshellに処理が移っている。

さて、あまりに簡単にコンテナまでたどり着いてしまったのと、同じフォルダを共有しているのとで、本当にここはコンテナなのか?本当に違う環境なのか?と疑ってしまいます。

なので、WSL2上のUbuntuと、コンテナ上のCOBOL環境とを比較してみました。

まずはWSL2上のUbuntuの情報を取り出してみます。

~/my-app/cobol$ ls -la
合計 16
drwxr-xr-x 3 piya piya 4096  7月  3 15:54 .
drwxr-xr-x 4 piya piya 4096  7月  3 15:49 ..
drwxr-xr-x 2 piya piya 4096  7月  3 15:54 .devcontainer
-rw-r--r-- 1 piya piya  218  7月  3 15:51 Dockerfile

~/my-app/cobol$ cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.2 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.2 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal

WSL2上ではUbuntuを動かしているのでUbuntuの情報が出力されますね。

続いてコンテナ上のCOBOL環境でも同じように調べてみます。

root@e6798d262066:/workspaces/cobol# ls -la
total 16
drwxr-xr-x 3 1000 1000 4096 Jul  3 06:54 .
drwxr-xr-x 3 root root 4096 Jul  3 06:54 ..
drwxr-xr-x 2 1000 1000 4096 Jul  3 06:54 .devcontainer
-rw-r--r-- 1 1000 1000  218 Jul  3 06:51 Dockerfile
root@e6798d262066:/workspaces/cobol# 

root@e6798d262066:/workspaces/cobol# cat /etc/os-release 
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

Dockerfileでベースイメージはbuildpack-deps:buster、つまりDebian 10を指定していました。

そのため、Debianの情報が出力されています。

そう、ここまででWindows10上の、WSL2(Ubuntu)上の、Dockerコンテナ(Debian)という環境が出来上がっているわけです。

Windows10

WSL2(Ubuntu)

Dockerコンテナ(Debian 10 + GnuCOBOL)

GnuCOBOLをインストールしてCOBOL開発が可能な環境

Dockerコンテナ(別の環境)

当然、別の環境もコンテナとして作成可能

さて、実際にCOBOLをコンパイルしてみます。

まず、拡張機能としてCOBOLを導入します。するとCOBOL用に構文の強調やアウトラインのサポートをしてくれるので非常に見やすくなります。

その後、新しくHELLO001.cblというファイルを作ります。

000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. HELLO001.
000300 PROCEDURE DIVISION.
000400 DISPLAY "Hello,World!".
000500 STOP RUN.

画面上だとこんな感じです。

それではソースを保存したら、コンパイルして実行してみましょう。下記ではXrefオプションでクロスリファレンス付きのコンパイルリストも出力しています。

root@e6798d262066:/workspaces/cobol# cobc -x -Xref -t compilelist.txt HELLO001.cbl 
root@e6798d262066:/workspaces/cobol# cat compilelist.txt 
GnuCOBOL 2.2.0          HELLO001.cbl         Sat Jul  3 07:03:01 2021  Page 0001

LINE    PG/LN  A...B............................................................

000001  000100 IDENTIFICATION DIVISION.
000002  000200 PROGRAM-ID. HELLO001.
000003  000300 PROCEDURE DIVISION.
000004  000400 DISPLAY "Hello,World!".
000005  000500 STOP RUN.

GnuCOBOL 2.2.0          HELLO001.cbl         Sat Jul  3 07:03:01 2021  Page 0002

NAME                           DEFINED                REFERENCES


      No fields defined.


GnuCOBOL 2.2.0          HELLO001.cbl         Sat Jul  3 07:03:01 2021  Page 0003

LABEL                          DEFINED                REFERENCES

E HELLO001                     4

0 warnings in compilation group
0 errors in compilation group

root@e6798d262066:/workspaces/cobol# ./HELLO001 
Hello,World!

上手くコンパイルできましたか?

これで、Windows10も、WSL2も全く汚さず、COBOLの編集とコンパイル環境ができました。

しかもDockerボリュームを手動で作成したり、割り付けたりする必要もなく作業フォルダの共有ができます。

当然コンテナから抜けても作ったソースや実行ファイルは消えません。

次回からはWSL2上でVisual Studio Codeを起動し、コンテナのReopenを選択すれば作成済みのコンテナを直接起動できるの初回ほど時間もかかりません。

なかなか良い感じじゃないでしょうか。

今回のDockerfileはDebianにGnuCOBOLをapt-get insallで追加してイメージを自作していますが、そもそもオフィシャルイメージが用意されているプログラミング言語であれば1行で済みます。

例えばJava(openjdk11)の開発環境であれば、これだけ。

FROM openjdk:11

適当な開発フォルダ作って、1行のDockerfile作って、VSCode起動して、コンテナをReopenするだけで開発環境できちゃうなんてめちゃくちゃ楽できる良い時代ですね。

コメントを残す

メールアドレスが公開されることはありません。