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を起動後の画面
続いてコンテナを作成します。左下の緑色のところをクリックしてコンテナへ接続します。
コンテナの作成と接続
コンテナが作成し終わったら、自動的にコンテナの環境を参照するようになります。
しかもこのやり方で環境を作成した場合(ここが肝なのですが)フォルダは元のWSL2上のフォルダと共有しています。
コンテナに接続された後の状態
さて、あまりに簡単にコンテナまでたどり着いてしまったのと、同じフォルダを共有しているのとで、本当にここはコンテナなのか?本当に違う環境なのか?と疑ってしまいます。
なので、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するだけで開発環境できちゃうなんてめちゃくちゃ楽できる良い時代ですね。