Armadilloフォーラム

コンテナからのコンテナ管理について

wit_akaiwa

2024年10月4日 10時02分

いつもお世話になっております。

ABOSをv3.20.3-at.3にバージョンアップしたところ、コンテナから「podman --remote stop」実行時に下記エラーが出るようになりました。

armadillo:~# podman exec -it mycontainer sh
# podman --remote stop mycontainer2
Error: json: cannot unmarshal string into Go struct field InspectContainerConfig.Config.StopSignal of type uint

調べるとホストのpodmanとバージョンが違うため出るエラーのようです。
ホストのバージョン:5.0.3
コンテナのバージョン:3.0.1

ホストのpodmanをダウングレードしようと思っているのですが、問題ありますでしょうか?

コメント

アットマークテクノの古賀です。

wit_akaiwaさん:
>ABOSをv3.20.3-at.3にバージョンアップしたところ、コンテナから「podman --remote stop」実行時に下記エラーが出るようになりました。
...
>調べるとホストのpodmanとバージョンが違うため出るエラーのようです。
>ホストのバージョン:5.0.3
>コンテナのバージョン:3.0.1

おっしゃる通りです。ご不便をおかけしてしまい、恐縮です。

>ホストのpodmanをダウングレードしようと思っているのですが、問題ありますでしょうか?

はい。podmann をダウングレードせずに対応する方法がありますので、そちらをお使いくださいませ。
マニュアルの「Web UI から Armadillo をセットアップする (ABOS Web)」で紹介している ABOS Web の REST API を使えば、コンテナから他のコンテナを起動・停できます。
 https://manual.atmark-techno.com/armadillo-iot-a6e/armadillo-iotg-a6e_p…

つまり、podman --remote による podman の REST API ではなく、ABOS Web の REST API でコンテナからのコンテナ管理を行うことができます。
詳細は、マニュアルの上記の節にある、「Rest API へのアクセス権の管理」の項と「Rest API : コンテナ操作」の項をご覧ください。

「Rest API へのアクセス権の管理」の項と「Rest API : コンテナ操作」の項に沿って設定してみましたが、以下のエラーが出ます。

# curl_rest -X POST https://host.containers.internal:58080/api/containers/mycontainer/stop
curl: (7) Failed to connect to host.containers.internal port 58080: No route to host

confに

add_ports 58080:58080

を追加してみましたが駄目でした。
他に何を設定すれば良いのでしょうか?

アットマークテクノの古賀(休日モード)です。

wit_akaiwaさん:
>「Rest API へのアクセス権の管理」の項と「Rest API : コンテナ操作」の項に沿って設定してみましたが、以下のエラーが出ます。
>

# curl_rest -X POST https://host.containers.internal:58080/api/containers/mycontainer/stop
curl: (7) Failed to connect to host.containers.internal port 58080: No route to host

abos-web サービスが起動していないのかも知れません。
もし、PC のブラウザから ABOS Web に接続できることを確認済みでなければ、次のコマンドを実行してみてくださいませ。

# rc-service abos-web status

出力される status が "started" でない場合は、abos-web が起動していませんので、マニュアルの「ABOS Web を起動する」で説明している手順で abos-web サービを起動してから、再度試してみてください。
 https://manual.atmark-techno.com/armadillo-iot-a6e/armadillo-iotg-a6e_p…

abos-web サービスが起動していない状態だった場合、v3.20.3-at.3 へのアップデート前に使っていらした ABOS のバージョンが、ABOS Web の導入前のものだったか、あるいは、アップデート用の初期設定を行う initial_update.swu を作成された際に、abos-web のパスワードを設定されなかったのではないかと思います:
 https://manual.atmark-techno.com/armadillo-iot-a6e/armadillo-iotg-a6e_p…

以上、ひとまずのコメントです。

休日対応ありがとうございました。

abos-web サービスは起動しています。

armadillo:~# rc-service abos-web status
 * status: started

コンテナ起動設定ファイルに「set_network host」を追加する事で上手くいきました。

ただ、「set_network host」を追加する前はcurlが使えていたのに、
「set_network host」を追加するとcurlが使えなくなっていました。

イメージの作成方法を見直すべきなのでしょうか?

> ただ、「set_network host」を追加する前はcurlが使えていたのに、
> 「set_network host」を追加するとcurlが使えなくなっていました。
すみません。勘違いでした。
dockerfileを確認したらcurlが入ってませんでした。
curlを追加してイメージを作り直して、正常に動く事が確認できました。

「set_network host」が必要という事で良いでしょうか?
またこの設定を入れる事で注意しないといけない事などありますでしょうか?

アットマークテクノの古賀です。

wit_akaiwaさん(2024年10月7日 15時43分):
>>ただ、「set_network host」を追加する前はcurlが使えていたのに、
>>「set_network host」を追加するとcurlが使えなくなっていました。
>すみません。勘違いでした。
>dockerfileを確認したらcurlが入ってませんでした。
>curlを追加してイメージを作り直して、正常に動く事が確認できました。

了解しました。

>「set_network host」が必要という事で良いでしょうか?

いえ。この設定なしでも使えるはずです。

実際、Armadillo-IoT A6E 付属のゲートウェイコンテナ(a6e-gw-container)で /bin/sh を対話モードで起動して、apk add で curl をインストールすれば ABOS Web の REST API 呼び出しができます。
a6e-gw-container.conf では、set_network host の設定は行っていません。

お使いのコンテナでは、コンテナ内でネットワーク関連の設定やサービスの実行などを行っていらっしゃるでしょうか?

> お使いのコンテナでは、コンテナ内でネットワーク関連の設定やサービスの実行などを行っていらっしゃるでしょうか?

いえ、行っていません。

使っているコンテナはVSCodeの「Python New Project」から作ったコンテナです。

Dockerfileとconfを添付しておきます。

ファイル ファイルの説明
app.conf
Dockerfile.txt

アットマークテクノの古賀です。
返事を差し上げるのが遅くなってしまいました。

wit_akaiwaさん(2024年10月9日 16時46分):
>>お使いのコンテナでは、コンテナ内でネットワーク関連の設定やサービスの実行などを行っていらっしゃるでしょうか?
>
>いえ、行っていません。
>
>使っているコンテナはVSCodeの「Python New Project」から作ったコンテナです。

了解しました。

>Dockerfileとconfを添付しておきます。

これを見る限り、要因になりそうなものは、ないですね。

wit_akaiwaさん(2024年10月4日 14時31分):
>「Rest API へのアクセス権の管理」の項と「Rest API : コンテナ操作」の項に沿って設定してみましたが、以下のエラーが出ます。
>

# curl_rest -X POST https://host.containers.internal:58080/api/containers/mycontainer/stop
curl: (7) Failed to connect to host.containers.internal port 58080: No route to host

curl のエラーが 'No route to host' ですから、host.containers.internal の名前解決は出来ており、配送可能な経路が見つからずにエラーする状況のようですね。
要因切り分けのために、このエラーが出る状況で、コンテナ内とコンテナ外(ABOS)で、それぞれ次のコマンドを実行して、その出力を教えて頂けますか:

・コンテナ内

# ip route

・コンテナ外

# ip route
# netstat -nplt | grep 58080
# iptables -S

'ip route' をコンテナ内と外でそれぞれ実行することで、それぞれのルーティングテーブルの内容が分かります。
'netsat -nplt | grep 5880' で は、TCP ポート 58080 で待ち受け(listen)しているプロセスの名前が分かります。abos-web が正常動作していれば、次のように出力されるはずです:

# netstat -nplt | grep 58080
tcp        0      0 :::58080                :::*                    LISTEN      1460/abos-web

最後に、'iptabes -S' でパケットフィルタ規則の一覧を出し、コンテナ内から abos-web への配送を阻害するものがないか見てみたいと思います。

お手数をかけますが、どうぞ宜しくお願いします。