今回は前回の続きでrclcppのサンプルプログラムを書くつもりでしたが、とある方からROS 2インストールの記事で紹介したDockerイメージをUpstreamにcommitして欲しいとの依頼を受けたため、本日はその結果報告を行います。

修正内容

現在、OSRFが管理しているROS関連のDockerfileはosrf/docker_imagesにまとめられています。

https://github.com/osrf/docker_images

この内、ROS 2のDockerfileが古くなっていて、6ヶ月以上前からビルドに失敗するようになっていました。

https://github.com/osrf/docker_images/blob/master/ros2/ros2/Dockerfile

Linux Development Setupのセットアップ手順と比較すると、以下の3項目が原因であることはわかっていました。

  • locale設定が足りない
  • APTパッケージが4つ足りない
  • pip3パッケージが2つ足りない

そこで、僕は先月のROS Japan UG #10の発表の時には、自分のレポジトリでゴリッと修正したものを作ってDocker Hubに登録して、Upstreamの問題は放置していました。

なぜ放置していたかというと、osrf/docker_imagesのDockerfileはPythonスクリプトと独自の構成ファイルを使って自動生成する仕組みになっていて、しかもその生成スクリプトの環境設定が3つのレポジトリに別れたモジュールを組み合わせて、いろいろと面倒なことをしないとできなかったからです。

https://github.com/osrf/docker_images/blob/master/doc/environment_setup.md

修正方法

でもenvironment_setup.mdを改めて見てみると、その環境設定を行うDockerfileがあるじゃないですか。

Note: This can all be bypassed by using the helper Dockerfile in the /docker folder.

というわけで、修正内容と再現方法がわかったところで、あとは簡単です。

$ docker run -it -v /path/to/docker_images:/tmp/docker_images osrf:docker /bin/bash
root@75cb2b34da71:/tmp/docker_images# ls
ros  ros2  sros
root@75cb2b34da71:/tmp/docker_images# cd ros2/
root@75cb2b34da71:/tmp/docker_images/ros2# ls
create_dockerfiles.py  images.yaml.em  platform.yaml  ros2
root@75cb2b34da71:/tmp/docker_images/ros2# ./create_dockerfiles.py dir -d .
Generating Dockerfile './ros2/Dockerfile':
root@75cb2b34da71:/tmp/docker_images/ros2# ls ros2
Dockerfile  ros2_entrypoint.sh
root@75cb2b34da71:/tmp/docker_images/ros2# git status
On branch ros2
Your branch is up-to-date with 'youtalk/ros2'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified:   ros2/Dockerfile

no changes added to commit (use "git add" and/or "git commit -a")

Dockerを使ったプログラミングのコツとして、-vオプションを使ってホストPCのディレクトリをDockerコンテナのディレクトリにマウントすることです。 Dockerではこのマウントされたディレクトリをデータボリュームと呼びます。

https://docs.docker.com/engine/tutorials/dockervolumes/#mount-a-host-directory-as-a-data-volume

これにより、コンテナ内で修正されたファイルを、ホストPCからも参照できるようになります。 先ほどのターミナルの続きから確認してみてください。

root@75cb2b34da71:/tmp/docker_images/ros2# exit
$ pwd
/home/yutaka/ros/infrastructure/docker_images
$ git status
On branch ros2
Your branch is up-to-date with 'youtalk/ros2'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified:   ros2/ros2/Dockerfile

no changes added to commit (use "git add" and/or "git commit -a")

osrf/docker_imagesレポジトリにプルリクエストを出しました。 あとはマージされることを期待して待つのみです。

https://github.com/osrf/docker_images/pull/60

せっかくオープンソース・ソフトウェアのROS/ROS 2を使っているのですから、自分本位の使い方だけでなく、貢献(コントリビューション)も忘れず怠らず意識しなくてはなりませんね。 頑張ります。