52594


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](https://hub.docker.com/_/eclipse-mosquitto) を手順通り進めると  
System error: exec format error が出た。

**GitHub の Mosibi/mosquitto で実験**  
TLS を行いたかったので GitHub にあった
[Mosibi/mosquitto](https://github.com/Mosibi/mosquitto) を手順通りに進めると  
System error: exec format error が出た。

ここで FROM で指定する OS を Raspbian にしないといけないことに気付く。

**Docker HUB の[schachr/raspbian-
stretch](https://hub.docker.com/r/schachr/raspbian-stretch/) で実験**  
docker pull schachr/raspbian-stretch して  
手順通り進めると無事コンテナの中のbashが起動する。  
その後 Hallo World の DockerFile を他から引用して実行すると無事表示。

**[Mosibi/mosquitto](https://github.com/Mosibi/mosquitto) の FROM を変更して実験**

[code]

    FROM schachr/raspbian-stretch:latest
    
[/code]

と変更して docker run 実行

[code]

    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
    
[/code]

すると

[code]

    System error: exec format error
    
[/code]

ここからエラー探しやDockerFileの変更などをトライ&エラーで実行して現在に至る(長かった orz けど朧気ながら Docker
の雰囲気がわかりました)  
ここからが本題です。

**【改変 DockerFile で実行したこと】**  
DockerFile

[code]

    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" ]
    
[/code]

Raspberry Pi の tree

[code]

    $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
    
[/code]

実行手順  
Docker run したが直ぐに Exited となる。

[code]

    $ 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
    
[/code]

Docker logs を見ると /init コマンドは実行されていることが分かった。

[code]

    $ 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==
    
[/code]

マウントしたボリュームを見るとCA証明書類が作成されている。

[code]

    $ 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
    
[/code]

コンテナをコミットして中に入る準備をする。

[code]

    $ docker commit mosquitto debug
    $ docker run --rm -it debug /bin/bash
    
[/code]

**ここから debug イメージの中**  
debug イメージの中を確認するとCA証明書類はない（マウントのコマンドをしてないから多分）

[code]

    $ pwd
    /etc/mosquitto/.ca
    $ ls -A
    .gitkeep
    
[/code]

ここで /init コマンドを実行してみる。

[code]

    $ /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==
    ▮
    
[/code]

プロンプトが点滅している状態がずっと続いてる。Ctr-P,Ctr-Qで戻れない。

ここで違う端末のSSHで同じアカウントにログインして確認する。

[code]

    $ 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
    
[/code]

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  
技量:初心者

[code]

    /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
    
[/code]

/init です

[code]

    #!/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
    
[/code]


CC BY-SA 4.0
2019-01-28T08:14:17.897
52373
2019-02-06T10:06:58.750
2019-01-28T08:42:48.757
19605
19605
question
linux docker raspberry-pi raspbian ssl
Raspberry Pi (Raspbian stretch) 上の Docker で Mosquitto が直ぐ Exited してしまう。


自己解決いたしました。  
様々なOSイメージを取り換えながら実行してようやく実行できる環境に出会えました。  
FROM arm32v7/buildpack-deps:stretch


CC BY-SA 4.0
2019-02-06T10:06:58.750
52594
2019-02-06T10:06:58.750
19605
52373
answer