Armadilloフォーラム

コンテナ起動時のみの実行するスクリプトファイル

m.yoshida

2024年3月6日 15時01分

コンテナ起動時のみに実行するスクリプトファイル実行する方法としてDockerfileに”ENTRYPOINT”を使おうと思いましたが、コンテナが起動しませんでした。
Dockerfile

COPY entrypoint.sh /tmp
RUN mv /tmp/entrypoint.sh /root
RUN chmod +x /root/entrypoint.sh
 
ENTRYPOINT ["/root/entrypoint.sh"]
CMD ["/lib/systemd/systemd"]

PID 1はsystemdを使用したいのですが、コンテナ起動時のみの実行するスクリプトファイルのようなことは可能でしょうか?

コメント

佐藤です。

何点か教えてください。
> コンテナ起動時のみに実行するスクリプトファイル実行する方法としてDockerfileに”ENTRYPOINT”を使おうと思いましたが、コンテナが起動しませんでした。
コンテナ起動時に何かエラーは表示されますでしょうか。
また、 "podman logs <コンテナ名>" を実行した時の表示はどのようになってますでしょうか。
entrypoint.sh ではどのような処理を行っているのでしょうか。

> PID 1はsystemdを使用したいのですが、コンテナ起動時のみの実行するスクリプトファイルのようなことは可能でしょうか?
systemd を使って具体的に何をしたいのかを教えていただければ、適切なアドバイスができると思います。

お世話になります。

> 何点か教えてください。
> コンテナ起動時に何かエラーは表示されますでしょうか。
→テーブルを作成するときのpostgesのエラーがでますが、この処理をなくしたら、なにもエラーがでませんが、コンテナは終了します。

sudo: unable to send audit message: Operation not permitted
psql: error: could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
psql: error: could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

> また、 "podman logs <コンテナ名>" を実行した時の表示はどのようになってますでしょうか。
> entrypoint.sh ではどのような処理を行っているのでしょうか。
→arimadillo A6Eのシリアル取得からファイルに保存とpostgresのデータベース及びテーブル作成の作成を行ってます。

やりたいのは、コンテナ作成した時のみ実行するスクリプトファイル(コマンドなど)をできないかと思ってます。

> > PID 1はsystemdを使用したいのですが、コンテナ起動時のみの実行するスクリプトファイルのようなことは可能でしょうか?
> systemd を使って具体的に何をしたいのかを教えていただければ、適切なアドバイスができると思います。

→sshd や postgresql などのサービス/デーモンを、コンテナ起動時に自動起動するために systemd を使用してます。

佐藤です。

ENTRYPOINT ["/root/entrypoint.sh"]
CMD ["/lib/systemd/systemd"]

このように書いた場合、"/root/entrypoint.sh" に引数として "/lib/systemd/systemd" が渡されますが、
entrypoint.sh の中で、渡されてきたこの"/lib/systemd/systemd" 実行していますでしょうか。
entrypoint.sh の中で、(dbの初期化などの後に) 「exec "$@"」 を実行するようにするとどうでしょうか。

ご回答ありがとうございます。
確かにENTRYPOINT とCMDの関係が理解できてなかったです。

>

> ENTRYPOINT ["/root/entrypoint.sh"]
> CMD ["/lib/systemd/systemd"]
> 

> このように書いた場合、"/root/entrypoint.sh" に引数として "/lib/systemd/systemd" が渡されますが、
> entrypoint.sh の中で、渡されてきたこの"/lib/systemd/systemd" 実行していますでしょうか。
> entrypoint.sh の中で、(dbの初期化などの後に) 「exec "$@"」 を実行するようにするとどうでしょうか。

entrypoint.sh にexec "$@"を入れましたが、うまくできなかったです。

#!/bin/bash
 
mkdir /etc/フォルダ名
echo $AT_PRODUCT_NAME >/etc/フォルダ名/テキスト名.txt
echo $AT_SERIAL_NUMBER >>/etc/フォルダ名/テキスト名.txt
exec "$@"

手順としては

Dockerfileからイメージ化
sudo podman build -t イメージ名 .
イメージからコンテナ
sudo podman run  --name=コンテナ名 --systemd=true  -d  イメージ名  /sbin/init
コンテナの中に入る
sudo podman exec -it  コンテナ名/bin/bash
このときに
Error: can only create exec sessions on running containers: container state improper

と出てしまいコンテナが終了してます。

佐藤です。

以下でコンテナを起動してみてください。

podman run  --name=コンテナ名 --systemd=always  -d  イメージ名 

ご回答ありがとうございます。
以下のコマンドでうごきました。

podman run  --name=コンテナ名 --systemd=always  -d  イメージ名 
 

2点質問があります。
1点目
--systemd=alwaysと --systemd=true の違いは何でしょうか?
2点目
armadillo a6eないの/etc/atmark/containers/のconfigファイルの設定はどのようにすればよろしでしょうか?
( --systemd=alwaysなど対応する箇所がありますか?)

佐藤です。

> 1点目
> --systemd=alwaysと --systemd=true の違いは何でしょうか?
https://docs.podman.io/en/latest/markdown/podman-run.1.html
systemd モードを有効にすることを強制するためのもののようです。
ENTRYPOINT でsystemdを起動する場合は必要なようです。

> 2点目
> armadillo a6eないの/etc/atmark/containers/のconfigファイルの設定はどのようにすればよろしでしょうか?
> ( --systemd=alwaysなど対応する箇所がありますか?)
add_args --systemd=always
を追加する必要があると思います。

ご回答ありがとうございます。
理解できました。
もう1点質問ですが、postgres のデータベース作成をする操作をentrypoint.sh追加してみたところ
作成されせんでした。
コンテナ内にはpostgres をインストールしてます。

#!/bin/bash
 
mkdir /etc/フォルダ名
echo $AT_PRODUCT_NAME >/etc/フォルダ名/テキスト名.txt
echo $AT_SERIAL_NUMBER >>/etc/フォルダ名/テキスト名.txt
 
sudo -u postgres psql <<EOF
CREATE USER name WITH PASSWORD 'pass';
CREATE DATABASE DB_name;
EOF
 
exec "$@"

スクリプトファイル自体は実行すると作成することは確認してます。
よろしくお願いします。