
Windows(WSL2)でDockerコンテナを立ててその中に開発環境を構築し,JetBrainsのCLionというIDEでC++プロジェクトの開発を行う方法をまとめます.
Windowsだけど,Linuxな開発環境で開発できるようになります.
まだ全然使い込めていないので不要なとこや足りないところありそうですが,まぁ自分用の忘備録ということで.
CLionのドキュメントはかなり豊富なので,結果的にはこのあたりをまとめた内容になります.
- https://pleiades.io/help/clion/remote-projects-support.html
- https://pleiades.io/help/clion/clion-toolchains-in-docker.html#build-and-run
ここで使用しているサンプルプロジェクトは以下です.
大まかなしくみ
Windows上(=ホスト)で動いているCLionが,Dockerコンテナ(=リモート)の開発環境を使うしくみについて,簡単に触れておきます.
CLionはSSH経由でリモートにアクセスします.開発対象のソースコードはホストにあるのですが,CLionがそれを随時リモートに同期します.
(なので,Dockerコンテナ側でSSHやSCPができるようにしておく必要があります)
ホストのCLion上でソースコードを編集すると随時リモート環境でもその編集が反映され,CLionのGUIでBuildなりRunなりの操作をすればCLionがそれをリモート環境で実行してくれる,というカタチで開発を行えます.
手順
1. 開発対象のプロジェクトの作成
普通にCLionで新規プロジェクトを作成します.

デフォルトで”Hello World”を標準出力してくれるプロジェクトを作ってくれます.

とりあえず今回はこのまま進めます.
2. 開発用Dockerイメージの用意
以下を参考にSSH接続可能なDockerイメージを作るためのDockerFileを作ります.
気にするところとしては,
- L.14で,ベースとするDockerイメージを適宜指定する
- 開発に必要な環境は別でDockerイメージを作成し,ここでベースイメージとして使用するのがキレイなのかな,と思ったりもします
- L.39, 40で,SSH接続に使用するアカウント(ユーザ名: user,パスワード: password)を設定しているが,ユーザ名/パスワードは変更したければ変更する
ぐらいかなぁと思います.とりあえずあんま気にせず突っ込んでおけばいいのではと.このDockerFile内でapt-getしているパッケージは,ベースイメージによっては不要なこともありそうなので適宜変更できそうですが,どれは抜いてはいけないかなどは未検証です.
今回のサンプルプロジェクトでは,dockerフォルダにDockerFile.devenvとDockerFile.devenv-clionの2つを作っています(詳しくはdocker-build.shを見てください).
DockerFile.devenvでは開発に使うパッケージなどの設定,ここでは具体的に最新のOpenCV(バージョン4.0台)をビルドしインストールしています.
DockerFile.devenv-clionは,上で挙げているSSH接続可能なDockerイメージを作るDockerFileをほぼそのまま使っています.ただし,ベースイメージはDockerFile.devenvから作ったDockerイメージに変更しています.
docker-build.shで,この2つのDockerFileのbuildが成功すれば,docker imagesで以下のように確認できます.
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE mu777/opencv-devenv-clion latest ae80e2b30513 17 minutes ago 1.9GB mu777/opencv-devenv latest 8c66b37ee381 26 minutes ago 1.4GB
mu777/opencv-devenvがDockerFile.devenvから作成されたDockerイメージで,mu777/opencv-devenv-clionがDockerFile.devenv-clionから作成されたDockerイメージになります.
3. 開発用Dockerコンテナの立ち上げ
mu777/opencv-devenv-clionを以下のようなコマンドでrunします.dockerコンテナ内のSSHの22ポートが,2224ポートにマッピングされています.--cap-add sys_ptraceはデバッグに必要とのことです.
$ docker run -d --cap-add sys_ptrace -p127.0.0.1:2224:22 --name opencv-dev mu777/opencv-devenv-clion
また,SSH キーをクリアする必要があるということで,以下のコマンドも実行します.
ssh-keygen -f "$HOME/.ssh/known_hosts" -R [localhost]:2224"
詳しくはこちら: Docker のツールチェーン | CLion
4. CLionの設定
CLionの,File > Settings よりもろもろ設定します.
Build, Execution, Deployment | Toolchains で,Toolchainを追加します.

Build, Execution, Deployment | CMake で,CMakeプロファイルを追加します.
- 「Toolchain」を前項で作成したものに設定

この時点で,Settingsの「OK」を押します.
すると,CLionがDockerコンテナ側へファイル送信し,Dockerコンテナ環境でのCMakeが走ります.
これらは,デフォルトで下部にある「File Transferツールウインドウ」と「CMakeツールウインドウ」で確認できます.(View > Tool windowsから表示/非表示を選択できます)

ファイル送信先について
デフォルトでは,リモート側の/tmpフォルダ以下にCLionが適当なフォルダを作り,そこにソースコードがコピーされます.
$ docker exec -it opencv-dev bash root@41f6c18e8c15:/# root@41f6c18e8c15:/# ls /tmp/tmp.VPKuynDPyG/ CMakeLists.txt cmake-build-debug-testdockerhost docker main.cpp
これは,Settingsの Build, Execution, Deployment | Deployment で設定ができます.
- 左のリストから,Toolchainと同じ名前のものを選択
- ちょっとよくわかってないですが,ここの設定はたまに勝手に増えて別設定が使用されたりします.どの設定が使われているかは「File Transferツールウインドウ」のタブ名を見ればわかります
- 上の「Connection」タブの「Root path」で,ルートとなるパスを設定
- 上の「Mappings」タブの「Deployment path」で,ルートパスからの相対で「Local path」のコピー先を設定

これでパスを設定しSettingsの「OK」を押すと,新しくホスト-リモート間のファイルSyncが始まり,CMakeが走り直します.
5. ビルド・実行
ここまでで設定は終わりです.
この時点で,すでにCMakeが自動で実行され,通ってると思います.
(されていなければ,左の歯車ボタンから「Reset cache and Reload Project」で再実行できます)

CLion上部の歯車ボタンでビルドが,再生ボタンで実行ができます.

ビルドした結果の様子:

実行した結果の様子:

確認
念のため,本当にDockerコンテナでビルドができているか確認します.
CMakeList.txtにOpenCV のバージョン4を使うように設定します.

また,ToolchainをWSLにしたCMakeプロファイルを追加します.

WSLを使う方法はこのブログなどが詳しいかなと思います.
この状態でCMakeを実行すると,Docker環境のToolchainを設定したCMakeプロファイルの方は成功しますが,WSLのToolchainの方は4.0のOpenCVが入っていないので失敗します.
