TEMPer の docker image を作ってみた備忘録

Cloud
Photo by hyt.

そのまんまです.docker の練習のために,格安 USB 温度計 TEMPer の docker image を作ってみました.

なお,docker のインストールについては,

CentOS7 に docker を入れる備忘録
CentOS7 に docker を入れる備忘録です.今回はホントに単なる備忘録です. CentOS7 の最小構成からの導入です. 入れるだけなら簡単ですね.念のため,依存パッケージの情報も載せておきます. $ cat /etc/cento...

を,USB 温度計 TEMPer については,

TEMPer 備忘録
TEMPer 備忘録です. 酷暑です.部屋の温度がヤバいです.なのでその管理のために MicroBot Push と Prota-Pi を導入したのですが,そもそも温度はどうなのよってことで,ネットワーク越しに監視できるようにしてみることに...

をご覧ください.

あと,今回は珍しく作ったものを dockerhub で公開しています.必要な方は,

Docker

にありますので,docker pull して下さい.なお,USB ID が 413d:2107 のもの用です.あと,ほんとは dockerhub の description に色々書くべきなんだとは思いますが,英語で書くの面倒なので,これはおいおいやることにして,どんな風に作ってあるかはこの blog に「日本語で」書いておきます.

dockerhub には他にイメージあるんじゃないの?

はい.他に2つ見つかります.しかも,詳しい説明付きのものが

Build software better, together
GitHub is where people build software. More than 100 million people use GitHub to discover, fork, and contribute to over...

にあるんですが,よく読むと 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

次の通り 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 の使い方が少し分かったような気がします.

以上!

CloudGadgetServer
スポンサーリンク
Following hyt!
タイトルとURLをコピーしました