Raspberry Pi (Raspbian stretch) 上の Docker で Mosquitto が直ぐ Exited してしまう。
Raspberry Pi (Raspbian stretch) 上で稼働する Docker で で Mosquitto が直ぐ Exited してしまう。
何度もトライ&エラーをしながら探ってきましたが何をすればいいか思いつきません。
なぜ Docker run で Exited となるのかがわかりません。
原因を探るための方法や場所、ファイルなど、何かのヒントでもよろしいのでご指摘いただけませんでしょうか。
よろしくお願いいたします。
【実現したいこと】
Raspberry Pi 上の Docker で Mosquitto Brokerを TLS で稼働させたい。
【今まで実行したこと】
Docker インストール
Raspberry Pi 3 B+ に 2018-11-13-raspbian-stretch-lite をインストール。
Docker を公式を参考にインストール。
Docker で Hallo World 実行確認済。
Docker HUB の eclipse-mosquitto で実験
Docker HUB にあった
eclipse-mosquitto を手順通り進めると
System error: exec format error が出た。
GitHub の Mosibi/mosquitto で実験
TLS を行いたかったので GitHub にあった Mosibi/mosquitto を手順通りに進めると
System error: exec format error が出た。
ここで FROM で指定する OS を Raspbian にしないといけないことに気付く。
Docker HUB の schachr/raspbian-stretch で実験
docker pull schachr/raspbian-stretch して
手順通り進めると無事コンテナの中のbashが起動する。
その後 Hallo World の DockerFile を他から引用して実行すると無事表示。
Mosibi/mosquitto の FROM を変更して実験
FROM schachr/raspbian-stretch:latest
と変更して docker run 実行
docker run -d --net=host \
-e "FQDN=mqtt.example.com" \
-e "EMAIL=me@example.com" \
-e "DOMAIN=example.com" \
-e "IPLIST=172.16.16.16 192.168.1.254" \
-e "HOSTLIST=somehost.example.com docker.example.com" \
-v /home/admin/mosquitto/conf.d:/etc/mosquitto/conf.d:z \
-t mosibi/mosquitto
すると
System error: exec format error
ここからエラー探しやDockerFileの変更などをトライ&エラーで実行して現在に至る(長かった orz けど朧気ながら Docker の雰囲気がわかりました)
ここからが本題です。
【改変 DockerFile で実行したこと】
DockerFile
FROM schachr/raspbian-stretch:latest
MAINTAINER admin <admind@example.com>
ENV LC_ALL="C" \
LANG="en_US.UTF-8" \
TZ="Asia/Tokyo"
WORKDIR /tmp
# Configure no init scripts to run on package updates.
ADD files/policy-rc.d /usr/sbin/policy-rc.d
RUN chmod 755 /usr/sbin/policy-rc.d && \
: dash を bash に変更 && \
ln -f /bin/bash /bin/sh && \
apt update && \
apt install -y rename openssl \
mosquitto mosquitto-clients && \
: mosquitto フォルダを空にする && \
rm -rf /etc/mosquitto && \
mkdir /etc/mosquitto
# COPY files
COPY volume /etc/mosquitto/
COPY files/generate-CA.sh /usr/local/bin/generate-CA.sh
COPY files/init /init
RUN chmod 755 /usr/local/bin/generate-CA.sh && \
chmod 755 /init
# generate-CA.sh 実行時のディレクトリ
WORKDIR /etc/mosquitto/.ca
# MQTT ports
#EXPOSE 1883
EXPOSE 8883
EXPOSE 9001
CMD [ "/init" ]
Raspberry Pi の tree
$HOME/SmartHome/
├─ README.md
└─ docker
└── mosquitto
├── Dockerfile
├── files
│ ├── generate-CA.sh
│ ├── init
│ └── policy-rc.d
└── volume
├── ca_certificates
│ └── mqtt_ca.crt
├── certs
│ ├── mqtt_srv.crt
│ └── mqtt_srv.key
├── conf.d
│ ├── mosquitto.conf
│ └── websockets.conf
├── mosquitto.conf
├── mosquitto.conf.example
└── password.txt
実行手順
Docker run したが直ぐに Exited となる。
$ cd SmartHome/docker/mosquitto
$ docker build -t admin/mosquitto .
$ docker run -it -d --name mosquitto --net=host \
-e "FQDN=pi.example.us" \
-e "EMAIL=me@example.com" \
-e "DOMAIN=example.com" \
-e "IPLIST=192.168.0.220 172.20.10.220" \
-e "HOSTLIST=pi pi.local pi.example.us 192.168.0.220 172.20.10.220" \
-v /home/admin/SmartHome/docker/mosquitto/volume:/etc/mosquitto \
-t admin/mosquitto
$ docker ps -a
・・・ Exited (1) 10 seconds ago
Docker logs を見ると /init コマンドは実行されていることが分かった。
$ docker logs mosquitto
/etc/mosquitto/.ca
Generating a RSA private key
...............+++++
................................................+++++
writing new private key to './ca.key'
-----
Created CA certificate in ./ca.crt
subject=
commonName = MQTT Broker example.com
organizationName = example.com
emailAddress = me@example.com
Warning: the CA key is not encrypted; store it safely!
--- Creating server key and signing request
Generating RSA private key, 2048 bit long modulus
..+++++
.....................................................................+++++
e is 65537 (0x010001)
--- Creating and signing server certificate
Signature ok
subject=CN = pi.example.us, O = example.com, emailAddress = me@example.com
Getting CA Private Key
total 28
-rw-r--r-- 1 1000 1000 21 Jan 28 16:00 .gitkeep
-r--r--r-- 1 root root 1281 Jan 28 16:07 mqtt_ca.crt
-r-------- 1 root root 1704 Jan 28 16:07 mqtt_ca.key
-rw-r--r-- 1 root root 17 Jan 28 16:07 mqtt_ca.srl
-r--r--r-- 1 root root 1891 Jan 28 16:07 mqtt_srv.crt
-rw-r--r-- 1 root root 968 Jan 28 16:07 mqtt_srv.csr
-r-------- 1 root root 1679 Jan 28 16:07 mqtt_srv.key
/etc/mosquitto/
total 60
drwxr-xr-x 2 1000 1000 4096 Jan 28 16:07 .ca
drwxr-xr-x 2 1000 1000 4096 Jan 28 16:07 ca_certificates
drwxr-xr-x 2 1000 1000 4096 Jan 28 16:07 certs
drwxr-xr-x 2 1000 1000 4096 Jan 28 16:00 conf.d
-rw-r--r-- 1 1000 1000 750 Jan 28 16:00 mosquitto.conf
-rw-r--r-- 1 1000 1000 33112 Jan 28 16:00 mosquitto.conf.example
-rw-r--r-- 1 1000 1000 115 Jan 28 16:00 password.txt
/etc/mosquitto/ca_certificates/
total 8
-rw-r--r-- 1 1000 1000 21 Jan 28 16:00 .gitkeep
-r--r--r-- 1 root root 1281 Jan 28 16:07 mqtt_ca.crt
/etc/mosquitto/certs/
total 12
-rw-r--r-- 1 1000 1000 21 Jan 28 16:00 .gitkeep
-r--r--r-- 1 root root 1891 Jan 28 16:07 mqtt_srv.crt
-r-------- 1 root root 1679 Jan 28 16:07 mqtt_srv.key
/etc/mosquitto/password.txt
admin:$6$uXNbKcSuDpNZYcmHivYC1fg3neSmmsdLxlI5A==
マウントしたボリュームを見るとCA証明書類が作成されている。
$ ls -A SmartHome/docker/mosquitto/volume/.ca
.gitkeep mqtt_ca.key mqtt_srv.crt mqtt_srv.key
mqtt_ca.crt mqtt_ca.srl mqtt_srv.csr
コンテナをコミットして中に入る準備をする。
$ docker commit mosquitto debug
$ docker run --rm -it debug /bin/bash
ここから debug イメージの中
debug イメージの中を確認するとCA証明書類はない(マウントのコマンドをしてないから多分)
$ pwd
/etc/mosquitto/.ca
$ ls -A
.gitkeep
ここで /init コマンドを実行してみる。
$ /init
WARNING: Your kernel does not support memory swappiness capabilities, memory swappiness discarded.
root@aba7a43aaeab:/etc/mosquitto/.ca# /init
/etc/mosquitto/.ca
Generating a RSA private key
..............................................................................+++++
.................................................................................................................+++++
writing new private key to './ca.key'
-----
Created CA certificate in ./ca.crt
subject=
commonName = MQTT Broker example.com
organizationName = example.com
emailAddress = me@example.com
Warning: the CA key is not encrypted; store it safely!
--- Creating server key and signing request
Generating RSA private key, 2048 bit long modulus
.................+++++
......+++++
e is 65537 (0x010001)
--- Creating and signing server certificate
Signature ok
subject=CN = pi.example.us, O = example.com, emailAddress = me@example.com
Getting CA Private Key
total 28
-rw-r--r-- 9 root root 21 Jan 28 16:00 .gitkeep
-r--r--r-- 1 root root 1281 Jan 28 16:40 mqtt_ca.crt
-r-------- 1 root root 1708 Jan 28 16:40 mqtt_ca.key
-rw-r--r-- 1 root root 17 Jan 28 16:40 mqtt_ca.srl
-r--r--r-- 1 root root 1883 Jan 28 16:40 mqtt_srv.crt
-rw-r--r-- 1 root root 968 Jan 28 16:40 mqtt_srv.csr
-r-------- 1 root root 1675 Jan 28 16:40 mqtt_srv.key
/etc/mosquitto/
total 60
drwxr-xr-x 1 root root 4096 Jan 28 16:40 .ca
drwxr-xr-x 1 root root 4096 Jan 28 16:40 ca_certificates
drwxr-xr-x 1 root root 4096 Jan 28 16:40 certs
drwxr-xr-x 2 root root 4096 Jan 28 16:10 conf.d
-rw-r--r-- 9 root root 750 Jan 28 16:00 mosquitto.conf
-rw-r--r-- 9 root root 33112 Jan 28 16:00 mosquitto.conf.example
-rw-r--r-- 9 root root 115 Jan 28 16:00 password.txt
/etc/mosquitto/ca_certificates/
total 8
-rw-r--r-- 9 root root 21 Jan 28 16:00 .gitkeep
-r--r--r-- 1 root root 1281 Jan 28 16:40 mqtt_ca.crt
/etc/mosquitto/certs/
total 12
-rw-r--r-- 9 root root 21 Jan 28 16:00 .gitkeep
-r--r--r-- 1 root root 1883 Jan 28 16:40 mqtt_srv.crt
-r-------- 1 root root 1675 Jan 28 16:40 mqtt_srv.key
/etc/mosquitto/password.txt
admin:$6$uXNKcSuDpNZYWO9I$6FmqWeO==
▮
プロンプトが点滅している状態がずっと続いてる。Ctr-P,Ctr-Qで戻れない。
ここで違う端末のSSHで同じアカウントにログインして確認する。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aba7a43aaeab debug "/bin/bash" 13 minutes ago Up 13 minutes 8883/tcp, 9001/tcp tender_poincare
Exited にならずに Up になっている。
以上が実行したことです。
なぜ最初の Docker run で Exited となるのかがわかりません。
何かのヒントでもよろしいのでご指摘いただけませんでしょうか。
よろしくお願いいたします。
【環境】
Raspberry Pi 3 B+
2018-11-13-Raspbian-Stretch-Lite
Doccker version
Client:
Version: 1.8.3
API version: 1.20
Go version: go1.4.3
Git commit: f4bf5c7
Built:
OS/Arch: linux/arm
Server:
Version: 1.8.3
API version: 1.20
Go version: go1.4.3
Git commit: f4bf5c7
Built:
OS/Arch: linux/arm
技量:初心者
/etc/mosquitto/mosquitto.conf はオリジナルのままです。
$ cat /etc/mosquitto/conf.d/mosquitto.conf
# 1883 はlocalhost 以外からは受け付けない
listener 1883 localhost
# TSL/SSL ポート
listener 8883
# 認証にパスワードファイルが必要になる
#allow_anonymous false
# パスワードファイル
password_file /etc/mosquitto/password.txt
# CA証明書
cafile /etc/mosquitto/ca_certificates/mqtt_ca.crt
# サーバー証明書
certfile /etc/mosquitto/certs/mqtt_srv.crt
# サーバーキー
keyfile /etc/mosquitto/certs/mqtt_srv.key
$ cat /etc/mosquitto/conf.d/websockets.conf
listener 9001
protocol websockets
/init です
#!/bin/bash
if [[ "new" = "$1" ]] ||
[[ ! -f /etc/mosquitto/ca_certificates/mqtt_ca.crt ]] ||
[[ ! -f /etc/mosquitto/certs/mqtt_srv.key ]] ||
[[ ! -f /etc/mosquitto/certs/mqtt_srv.crt ]]; then
cd /etc/mosquitto/.ca
pwd
rm -rf *
# CA証明書生成
/usr/local/bin/generate-CA.sh ${FQDN}
# ca.xxx ファイルをリネーム
/usr/bin/rename s/ca./mqtt_ca./ *
# pi.example.us.xxx ファイルをリネーム
/usr/bin/rename s/${FQDN}/mqtt_srv/ *
ls -Al
# mosquitto に配置
cp -rf mqtt_ca.crt /etc/mosquitto/ca_certificates/
cp -rf mqtt_srv.crt /etc/mosquitto/certs/
cp -rf mqtt_srv.key /etc/mosquitto/certs/
echo /etc/mosquitto/
ls -Al /etc/mosquitto/
echo /etc/mosquitto/ca_certificates/
ls -Al /etc/mosquitto/ca_certificates/
echo /etc/mosquitto/certs/
ls -Al /etc/mosquitto/certs/
echo /etc/mosquitto/password.txt
cat /etc/mosquitto/password.txt
fi
/usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf