そのまんまです.docker の練習のために,格安 USB 温度計 TEMPer の docker image を作ってみました.
なお,docker のインストールについては,
を,USB 温度計 TEMPer については,
をご覧ください.
あと,今回は珍しく作ったものを dockerhub で公開しています.必要な方は,
にありますので,docker pull して下さい.なお,USB ID が 413d:2107 のもの用です.あと,ほんとは dockerhub の description に色々書くべきなんだとは思いますが,英語で書くの面倒なので,これはおいおいやることにして,どんな風に作ってあるかはこの blog に「日本語で」書いておきます.
dockerhub には他にイメージあるんじゃないの?
はい.他に2つ見つかります.しかも,詳しい説明付きのものが
にあるんですが,よく読むと QNAP docker container station 向けだそうで,実際,CentOSでは動きません.あと,もう一つ見つかるんですが,これは使い方が全くわからない…….
と言うことで,まぁ,地味に使ってくれる人もいるかもしれない,と思い公開することにした訳です.もちろん docker hub の使い方を知りたかったというのもあります.
docker image の概要と使い方
ベースは alpine linux です.容量は7MByteくらい.
Dockefile の公開ではなく,イメージを公開した理由は簡単で,docker image を小さくするために,予めコンパイルしておいた実行ファイルと最低限のライブラリをまとめて /usr/local 以下に展開したからです.
凝ったことは何もしてません.単にターミナルに温度を表示するだけの作りです.docker の hello-world と同じようなものだと思ってください(hello-world の方が圧倒的に小さい……どうやって作ってるんだろう……).
なお,動作 x86 な CentOS7 でしか確かめていませんので,悪しからず.
使い方は,まずは docker image を取ってきて,実行します.
$ docker pull labohyt/temper $ docker run --name temper -t --device=/dev/hidraw0 --device=/dev/hidraw1 temper temperature 21.06 °C
一度実行すれば,2回目からは,
$ docker start -a temper temperature 20.87 °C
とすれば再び実行されます.2回目以降も docker run … で実行できますが,これをやると停止されたスナップショットが大量に溜まって面倒なので,スナップショットを再起動してやる方が良いと思います.
なお,docker の image って,どちらかというと Web server とか動かすことの方が多いんじゃないかなと思いますし,たかだか実行ファイル1個のために作るようなものじゃない気もするんですが,レシピを見るとわかる通り,この TEMPer の実行イメージ作って実行するって結構面倒で下手をするとかなり環境が汚れるんです.だから docker を使うことで環境を汚さずに済むってのがメリットなんじゃないかと.あと 7M とあまり大きくないのも docker で作っても良いんじゃないかなと思った理由ですね.
レシピ
作り方は以下の通り.まずは,TEMPer の温度を読み込んで表示する temperd っていうプログラムを alpine linux 上でコンパイルしました.注意点は以下の3つです.
- hidapi-dev をインストールするために testing のリポジトリを追加した.
- /usr/local/lib64 は alpine linux は標準だと読まないので,/usr/local/lib を消して /usr/local/lib64 から /usr/local/lib にシンボリックリンクを張った.
- hidapi-dev でインストールされるライブラリを /usr/local/lib64 にコピーして,docker image 作るときは展開するだけで使えるようにした.
なお,下の2つは手抜きのためです.
# docker pull alpine # docker run -it --device=/dev/hidraw0 --device=/dev/hidraw1 alpine # mkdir /usr/local/src # cd /usr/local/src # vi /etc/apk/repositories http://dl-cdn.alpinelinux.org/alpine/edge/main http://dl-cdn.alpinelinux.org/alpine/edge/community http://dl-cdn.alpinelinux.org/alpine/edge/testing # apk add git make gcc libc-dev libusb-compat libusb-compat-dev bash cmake hidapi-dev 1/45) Upgrading musl (1.1.20-r3 -> 1.1.20-r4) (2/45) Installing ncurses-terminfo-base (6.1_p20190105-r0) (3/45) Installing ncurses-terminfo (6.1_p20190105-r0) (4/45) Installing ncurses-libs (6.1_p20190105-r0) (5/45) Installing readline (7.0.003-r1) (6/45) Installing bash (4.4.19-r1) Executing bash-4.4.19-r1.post-install (7/45) Installing libattr (2.4.47-r7) (8/45) Installing libacl (2.2.52-r5) (9/45) Installing libbz2 (1.0.6-r6) (10/45) Installing expat (2.2.6-r0) (11/45) Installing lz4-libs (1.8.3-r2) (12/45) Installing xz-libs (5.2.4-r0) (13/45) Installing libarchive (3.3.2-r4) (14/45) Installing ca-certificates (20190108-r0) (15/45) Installing nghttp2-libs (1.35.1-r0) (16/45) Installing libssh2 (1.8.1-r0) (17/45) Installing libcurl (7.64.0-r1) (18/45) Installing libgcc (8.2.0-r2) (19/45) Installing rhash-libs (1.3.6-r2) (20/45) Installing libstdc++ (8.2.0-r2) (21/45) Installing libuv (1.23.2-r0) (22/45) Installing cmake (3.13.0-r0) (23/45) Installing cmake-bash-completion (3.13.0-r0) (24/45) Installing binutils (2.31.1-r2) (25/45) Installing gmp (6.1.2-r1) (26/45) Installing isl (0.18-r0) (27/45) Installing libgomp (8.2.0-r2) (28/45) Installing libatomic (8.2.0-r2) (29/45) Installing mpfr3 (3.1.5-r1) (30/45) Installing mpc1 (1.0.3-r1) (31/45) Installing gcc (8.2.0-r2) (32/45) Installing pcre2 (10.32-r1) (33/45) Installing git (2.20.1-r0) (34/45) Installing eudev-libs (3.2.7-r0) (35/45) Installing libusb (1.0.22-r0) (36/45) Installing hidapi (0.8.0_rc1-r1) (37/45) Installing pkgconf (1.6.0-r0) (38/45) Installing hidapi-dev (0.8.0_rc1-r1) (39/45) Installing musl-dev (1.1.20-r4) (40/45) Installing libc-dev (0.7.1-r0) (41/45) Upgrading musl-utils (1.1.20-r3 -> 1.1.20-r4) (42/45) Installing libusb-compat (0.1.5-r4) (43/45) Installing libusb-dev (1.0.22-r0) (44/45) Installing libusb-compat-dev (0.1.5-r4) (45/45) Installing make (4.2.1-r2) # git clone https://github.com/hughesr/TEMPered # cd TEMPered # git checkout hack-413d-2107 # git reset --hard 75aa1e2 # cmake . # make # make install # rm -rf /usr/local/lib /usr/local/src # ln -s /usr/local/lib64 /usr/local/lib # cp -rf /usr/lib64/libhidapi-* /usr/local/lib64/. # tar -cvzf /tmp/tempered.tar.gz /usr/local # exit $ docker cp [CONTAINER ID]:/tmp/tempered.tar.gz .
次は docker image を build するための Dockerfile の作成です.今回は以下の内容で作りました.
# BASE IMAGE FROM alpine:latest # AUTHOR MAINTAINER hyt # MAKE COPY files/tempered.tar.gz /tmp/ RUN apk add eudev-libs \ && rmdir /usr/local/lib \ && tar -zxvf /tmp/tempered.tar.gz -C / \ && rm /tmp/tempered.tar.gz # COMMAND CMD ["/usr/local/bin/tempered"]
次は docker image の作成です.カレントディレクトリに Dockerfile を配置し,tempered.tar.gz を files ディレクトリ以下に配置した上で,
$ docker build -t temper temper/. Sending build context to Docker daemon 80.9 kB Step 1/5 : FROM alpine:latest ---> 5cb3aa00f899 Step 2/5 : MAINTAINER hyt ---> Running in 19a637c22617 ---> 973dd556a891 Removing intermediate container 19a637c22617 Step 3/5 : COPY files/tempered.tar.gz /tmp/ ---> 27c1857cae07 Removing intermediate container fe983c42e1e9 Step 4/5 : RUN apk add eudev-libs && rmdir /usr/local/lib && tar -zxvf /tmp/tempered.tar.gz -C /usr && rm /tmp/tempered.tar.gz ---> Running in ace7dff503ab fetch http://dl-cdn.alpinelinux.org/alpine/v3.9/main/x86_64/APKINDEX.tar.gz fetch http://dl-cdn.alpinelinux.org/alpine/v3.9/community/x86_64/APKINDEX.tar.gz (1/1) Installing eudev-libs (3.2.7-r0) OK: 6 MiB in 15 packages local/ local/bin/ local/bin/hid-query local/bin/tempered local/lib local/share/ local/share/ca-certificates/ local/include/ local/include/tempered.h local/include/tempered-util.h local/lib64/ local/lib64/libtempered.so.0 local/lib64/libtempered.so local/lib64/libtempered-util.so.0 local/lib64/libtempered-util.so local/lib64/libhidapi-hidraw.a local/lib64/libhidapi-hidraw.so local/lib64/libhidapi-hidraw.so.0 local/lib64/libhidapi-hidraw.so.0.0.0 local/lib64/libhidapi-libusb.a local/lib64/libhidapi-libusb.so local/lib64/libhidapi-libusb.so.0 local/lib64/libhidapi-libusb.so.0.0.0 ---> 053316a9de7d Removing intermediate container ace7dff503ab Step 5/5 : CMD /usr/local/bin/tempered ---> Running in 9a825ac02668 ---> 1dd8c966c4ef Removing intermediate container 9a825ac02668 Successfully built 1dd8c966c4ef $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE tempere latest 1dd8c966c4ef 27 seconds ago 7.4 MB docker.io/alpine latest 5cb3aa00f899 2 weeks ago 5.53 MB
の通り実行した結果,docker image として temper が出来上がりました.試しに実行してみた様子は以下の通りです.
$ docker run --name temper -t --device=/dev/hidraw0 --device=/dev/hidraw1 temper /dev/hidraw1 0: temperature 18.18 °C /dev/hidraw1 1: Failed to get the temperature: Not enough data was read from the sensor. /dev/hidraw1 1: no sensor data available $ docker start -a temper /dev/hidraw1 0: temperature 18.18 °C /dev/hidraw1 1: Failed to get the temperature: Not enough data was read from the sensor. /dev/hidraw1 1: no sensor data available
最後に dockerhub への公開です.まず,以下のサイトから,dockerhub に Sign Upして,
次の通り docker image を docker hub に登録しました.
$ docker login Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. Username: labohyt Password: Login Succeeded $ docker tag temper labohyt/temper $ docker push labohyt/temper The push refers to a repository [docker.io/labohyt/temper] 205d7da23e1b: Pushed bed64e2a0c6f: Pushed bcf2f368fe23: Mounted from library/alpine latest: digest: sha256:9e7900cfd17e9e53e445a91a0ee433f0d4d28fbd1dcdb5b71ee8e9e92e453ebb size: 948
なお,サイトには最低限の解説を入れましたが,解説部分の文法は Markdown で書くみたいですね.
と言うことで,まぁ,手抜きですが,何となく docker の使い方が少し分かったような気がします.
以上!