Armadilloフォーラム

VSCode上で「アプリをArmadilloで実行」を実施した際にエラーとなってアプリを実行できない

takeshita_kyouhei

2024年3月22日 8時58分

VSCode上で「アプリをArmadilloで実行」を実施した際にエラーとなってアプリを実行することができません

以下のようなエラーが発生します

data_uploader.conf                                                                                                                                         100% 1048   294.8KB/s   00:00    
warning: previously set command is overwritten. The following command will NOT be executed:
warning: python3 /vol_app/src/main.py
warning: previously set command is overwritten. The following command will NOT be executed:
warning: influxd run
Starting 'data_uploader'
time="2024-03-22T08:50:30+09:00" level=warning msg="The input device is not a TTY. The --tty and --interactive flags might not work properly"
eea3a960b9cc6ca875359e982ede29fa2bfd6d07d609cd3ddbc814b67c854b9e
2024/03/21 23:50:30 E! unknown command "run"

アプリ設定ファイル「data_uploader.conf」→「app.conf」になにか問題があるという認識なのですが、修正必要な点はありますでしょうか?
以下、現状の「app.conf」になります

set_image localhost/{{PROJECT}}:latest
 
# mount app sources and data:
# - /var/app/rollback/volumes can be rolled back on failed
# upgrades, suitable for application sources and assets.
# - /var/app/volumes is not copied on updates and more suitable
# for volatile data such as logs and databases.
add_volumes /var/app/rollback/volumes/{{PROJECT}}:/vol_app
add_volumes /var/app/volumes/{{PROJECT}}:/vol_data
 
# Allow LED to be written. This is application specific
# and should be changed depending on your needs.
add_volumes /sys:/sys
 
add_ports 8086:8086
 
# Allow input to containers and see output from containers
# python bufferizes its output by default when stdout is not a terminal,
# so print() statements would only be printed after a sufficient number
# of messages have accumulated. Force immediate output without flush for
# convenient logging
add_args -it
 
# Add environment variables set by Atmark Techno.
add_armadillo_env
 
# launch app
set_command python3 /vol_app/src/main.py
set_command influxd run
set_command telegraf run
コメント

佐藤です。

すいません。このように複数のset_commandを並べて使うことはできません。
最後のset_commandで上書きされます。

# launch app
set_command python3 /vol_app/src/main.py
set_command influxd run
set_command telegraf run

たとえば、以下のような内容のシェルスクリプトを用意して、それを set_command で実行する方法ではどうでしょうか。

#!/bin/sh
python3 /vol_app/src/main.py
influxd run
telegraf run

これを、launch.sh のようなファイル名で保存して、
set_command (launch.shを置いたディレクトリ)/launch.sh
とします。

takeshita_kyouhei

2024年3月22日 11時26分

本件返信いただきありがとうございます

>

> #!/bin/sh
> python3 /vol_app/src/main.py
> influxd run
> telegraf run
> 

> これを、launch.sh のようなファイル名で保存して、
> set_command (launch.shを置いたディレクトリ)/launch.sh
> とします。
上記に記載されています「set_command (launch.shを置いたディレクトリ)/launch.sh」の(launch.shを置いたディレクトリ)はコンテナ内部のパスという認識であっていますでしょうか?

app.conf(抜粋)

# launch app
set_command /vol_app/launch.sh

Dockerfile(抜粋)

ARG PRODUCT
COPY resources [r]esources_${PRODUCT} /
COPY launch.sh /vol_app/

上記のように設定していますが、正常にアプリを実行できませんでした
エラー内容は以下のとおりです

 *  実行するタスク: ./scripts/run_armadillo.sh 
 
data_uploader.conf                                                                                                                                         100%  989   369.4KB/s   00:00    
Starting 'data_uploader'
time="2024-03-22T11:19:33+09:00" level=warning msg="The input device is not a TTY. The --tty and --interactive flags might not work properly"
2bc3053b3df9332da36f9c4b958580dce7236798b6800881dabfbe788119e321
Error: you can only attach to running containers

佐藤です。

> app.conf(抜粋)
>

> # launch app
> set_command /vol_app/launch.sh
> 

>
> Dockerfile(抜粋)
>

> ARG PRODUCT
> COPY resources [r]esources_${PRODUCT} /
> COPY launch.sh /vol_app/
> 

app/src の下に launch.sh を作成すれば COPY launch.sh /vol_app/ は不要で、
set_command /vol_app/src/launch.sh とすれば良いと思います。

>
> 上記のように設定していますが、正常にアプリを実行できませんでした
> エラー内容は以下のとおりです
>

>  *  実行するタスク: ./scripts/run_armadillo.sh 
> 
> data_uploader.conf                                                                                                                                         100%  989   369.4KB/s   00:00    
> Starting 'data_uploader'
> time="2024-03-22T11:19:33+09:00" level=warning msg="The input device is not a TTY. The --tty and --interactive flags might not work properly"
> 2bc3053b3df9332da36f9c4b958580dce7236798b6800881dabfbe788119e321
> Error: you can only attach to running containers
> 

launch.sh に実行権は与えましたでしょうか。
chmod +x launch.sh

takeshita_kyouhei

2024年3月22日 14時29分

返信いただきありがとうございます

> launch.sh に実行権は与えましたでしょうか。
> chmod +x launch.sh
取り急ぎATDE9上で実行権は付与しました

上記について、確認したいのですが
1.実行権はATDE9上で付与するので間違いないでしょうか?
 コンテナ上で実行権を付与する必要がある?
 →ATDE9で付与された実行権をコンテナ上に再現している?
2.このlaunch.shはATDE上で実行される?
 「アプリをArmadilloで実行」を実施した際の挙動は、ATDE9上からArmadilloに指示を行っているだけ?

佐藤です。

> 1.実行権はATDE9上で付与するので間違いないでしょうか?
>  コンテナ上で実行権を付与する必要がある?
>  →ATDE9で付与された実行権をコンテナ上に再現している?
ATDE9上で付与します。今回の場合ですと実行権を与えたlaunch.shが
Armadilloへ転送され、コンテナ内で実行されます。

> 2.このlaunch.shはATDE上で実行される?
>  「アプリをArmadilloで実行」を実施した際の挙動は、ATDE9上からArmadilloに指示を行っているだけ?
Armadillo上のコンテナ内で実行されます。
「アプリをArmadilloで実行」を実施した際の挙動は、アプリのソースやコンテナのconfファイルをArmadilloへ転送し、
Armadillo上のコンテナを起動します。

takeshita_kyouhei

2024年3月22日 15時31分

launch.shに対して、実行権限を付与してみたり、app.confに記載するコマンドを「set_command sh /vol_app/launch.sh」に変更してみましたが、アプリの実行ができません
以下のようなエラーがVSCode上に表示されます

 *  実行するタスク: ./scripts/run_armadillo.sh 
 
Warning: Permanently added '192.168.3.67' (ECDSA) to the list of known hosts.
data_uploader.conf                                                                                                                                         100%  992   448.7KB/s   00:00    
Starting 'data_uploader'
time="2024-03-22T15:26:53+09:00" level=warning msg="The input device is not a TTY. The --tty and --interactive flags might not work properly"
c7554ea94aa86c9b7a0f5fa40c2e93b04d1ae3c1d9aade8f959b69f8950091ca
Error: you can only attach to running containers

なお、Armadilloにssh接続し、「podman exec -it data_uploader /bin/bash」コマンドを実行し、直接コンテナ内に入ろうとしたところこちらも実施できませんでした
以下のようなエラーが表示されています

armadillo:~$ podman exec -it data_uploader /bin/bash
ERRO[0000] running `/usr/bin/newuidmap 1672 0 1000 1 1 100000 65536`: newuidmap: Could not set caps 
Error: cannot set up namespace using "/usr/bin/newuidmap": should have setuid or have filecaps setuid: exit status 1

佐藤です。

> なお、Armadilloにssh接続し、「podman exec -it data_uploader /bin/bash」コマンドを実行し、直接コンテナ内に入ろうとしたところこちらも実施できませんでした
> 以下のようなエラーが表示されています
>

> armadillo:~$ podman exec -it data_uploader /bin/bash
> ERRO[0000] running `/usr/bin/newuidmap 1672 0 1000 1 1 100000 65536`: newuidmap: Could not set caps 
> Error: cannot set up namespace using "/usr/bin/newuidmap": should have setuid or have filecaps setuid: exit status 1
> 

こちらに関しては、atmark ユーザーでログインしているため発生しています。
su コマンドなどで root ユーザーになってから実行してみてください。

takeshita_kyouhei

2024年3月25日 10時21分

> > 以下のようなエラーが表示されています
> >

> > armadillo:~$ podman exec -it data_uploader /bin/bash
> > ERRO[0000] running `/usr/bin/newuidmap 1672 0 1000 1 1 100000 65536`: newuidmap: Could not set caps 
> > Error: cannot set up namespace using "/usr/bin/newuidmap": should have setuid or have filecaps setuid: exit status 1
> > 

> こちらに関しては、atmark ユーザーでログインしているため発生しています。
> su コマンドなどで root ユーザーになってから実行してみてください。
上記回答いただきありがとうございました

もう一方の質問についても回答いただくことは可能でしょうか?
 こちらのほうが深刻です

>launch.shに対して、実行権限を付与してみたり、app.confに記載するコマンドを「set_command sh /vol_app/launch.sh」に変更してみましたが、アプリの実行ができません
>以下のようなエラーがVSCode上に表示されます

> *  実行するタスク: ./scripts/run_armadillo.sh 
> 
>Warning: Permanently added '192.168.3.67' (ECDSA) to the list of known hosts.
>data_uploader.conf                                                                                                                                         100%  992   448.7KB/s   00:00    
>Starting 'data_uploader'
>time="2024-03-22T15:26:53+09:00" level=warning msg="The input device is not a TTY. The --tty and --interactive flags might not work properly"
>c7554ea94aa86c9b7a0f5fa40c2e93b04d1ae3c1d9aade8f959b69f8950091ca
>Error: you can only attach to running containers

佐藤です。

> > *  実行するタスク: ./scripts/run_armadillo.sh 
> > 
> >Warning: Permanently added '192.168.3.67' (ECDSA) to the list of known hosts.
> >data_uploader.conf                                                                                                                                         100%  992   448.7KB/s   00:00    
> >Starting 'data_uploader'
> >time="2024-03-22T15:26:53+09:00" level=warning msg="The input device is not a TTY. The --tty and --interactive flags might not work properly"
> >c7554ea94aa86c9b7a0f5fa40c2e93b04d1ae3c1d9aade8f959b69f8950091ca
> >Error: you can only attach to running containers

エラーが発生した際、armadilloへログインし "podman logs data_uploader" と実行するとどのようなログが表示されますでしょうか。

takeshita_kyouhei

2024年3月25日 13時35分

ABOSWeb上のコンテナログには以下のようなログが記録されていました

sh: 0: cannot open /vol_app/launch.sh: No such file 

VSCode上では、/app/srcフォルダ配下にlaunch.shを配置
また、app.confでは以下のように実行を指定しています

# launch app
set_command sh /vol_app/launch.sh
ファイル ファイルの説明
VSCode.png

takeshita_kyouhei

2024年3月25日 13時39分

>エラーが発生した際、armadilloへログインし "podman logs data_uploader" と実行するとどのようなログが表示されますでしょうか。
上記ログを確認しました
以下の別件で報告していたものと同じログが記録されています

>

> sh: 0: cannot open /vol_app/launch.sh: No such file 
> 

佐藤です。

> # launch app
> set_command sh /vol_app/launch.sh

以下のようにするとどうでしょうか。

# launch app
set_command sh /vol_app/src/launch.sh

takeshita_kyouhei

2024年3月25日 23時39分

> 佐藤です。
>
>

> > # launch app
> > set_command sh /vol_app/launch.sh
> 

> 以下のようにするとどうでしょうか。
>

> # launch app
> set_command sh /vol_app/src/launch.sh
> 

上記コマンドでアプリの実行ができるようになりました

しかし、launch.shに記載した「influxdb」と「telegraf」が実行されていないことを確認しています
> python3 /vol_app/src/main.py
> influxd run
> telegraf run

事象としては、アプリの実行時に「main.py」がプロセスを掴んでいるため、以降に記載されたinfluxdやtelegrafが実行できていないものと考えています
→main.pyはソフト内部でループして、一定時間ごとにサーバへjsonデータを送信しています

事実、launch.shに記載するコマンドの順番を以下のように変更すると実行状態が変わりました
> influxd run
> telegraf run
> python3 /vol_app/src/main.py
状態
Influxdb:起動
telegraf:未起動
main.py:未起動
→今度はInfluxdbがプロセスを掴んでいるのか、telegrafやmain.pyが実行できない

現状の実行方法では「main.py」、「Influxdb」、「telegraf」をそれぞれ起動できないと考えているのですが、解決方法はありますでしょうか?

佐藤です。

> 現状の実行方法では「main.py」、「Influxdb」、「telegraf」をそれぞれ起動できないと考えているのですが、解決方法はありますでしょうか?
launch.shの中身を以下のようにしてみるとどうでしょうか

#!/bin/sh
python3 /vol_app/src/main.py &
influxd run &
telegraf run

takeshita_kyouhei

2024年3月27日 9時39分

返信いただきありがとうございました

> launch.shの中身を以下のようにしてみるとどうでしょうか
>

> #!/bin/sh
> python3 /vol_app/src/main.py &
> influxd run &
> telegraf run
> 

上記をもとに、以下のように変更を行ってみました

#!/bin/sh
influxd run &
python3 /vol_app/src/main.py &
telegraf run

この設定ですと、ABOSDEからアプリを実行すると「InfluxDB」と「main.py」が実行されることは確認できました
しかし、「Telegraf」が実行されていません

設定している「Telegraf」の宛先(接続先)は同コンテナ内の「InfluxDB」であるため、
「InfluxDB」と「Telegraf」がほぼ同時に起動→「InfluxDB」が起動間もなく、「Telegraf」は宛先がいないため、起動に失敗しエラーで落ちる

この流れで「Telegraf」の起動に失敗しているのではないかと考え、以下のようにlaunch.shを修正してみましたが、変わらず起動に失敗しています

#!/bin/sh
influxd run &
sleep 5 &&
python3 /vol_app/src/main.py &
telegraf run

現状「Telegraf」が起動しない問題については、「Telegraf起動時に宛先がいない」or「そもそもTelegraf起動のコマンドが間違えている」であると考察・調査中になります

佐藤です。

> 現状「Telegraf」が起動しない問題については、「Telegraf起動時に宛先がいない」or「そもそもTelegraf起動のコマンドが間違えている」であると考察・調査中になります
以下をみると、 telegraf には run というコマンドは無いように見えます。
https://docs.influxdata.com/telegraf/v1/commands/

佐藤です。

> > 以下をみると、 telegraf には run というコマンドは無いように見えます。
> > https://docs.influxdata.com/telegraf/v1/commands/
> Telegrafを手動で起動する場合は、「service telegraf start」としています
> こちらはluanch.shに記載しても認識されるのでしょうか?
認識されないと思います。
上記サイトを見る限り以下で起動できるように見えます。
telegraf --config <コンフィグファイル>

takeshita_kyouhei

2024年3月28日 23時05分

返信いただきありがとうございます

最終的には以下のようになりました
 service telegraf start も試行しました(コンテナ内でtelegrafをサービスとして起動するコマンドであるため)が、
 コンテナ自体が起動しなくなりました

#!/bin/sh
influxd run &
sleep 10 &&
telegraf &
sleep 30 &&
python3 /vol_app/src/main.py

Telegrafを早く起動すると、InfluxDBが立ち上がり切っていないのにデータを書き込もうとしてエラーとなるためタイマーを入れています
また。main.pyはInfluxDBからデータを取得するパイソンプログラムであるため、最後に起動するようにしています