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を使用したいのですが、コンテナ起動時のみの実行するスクリプトファイルのようなことは可能でしょうか?
コメント
m.yoshida
お世話になります。
> 何点か教えてください。
> コンテナ起動時に何かエラーは表示されますでしょうか。
→テーブルを作成するときの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 を使用してます。
at_makoto.sato
m.yoshida
ご回答ありがとうございます。
確かに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
と出てしまいコンテナが終了してます。
at_makoto.sato
m.yoshida
at_makoto.sato
佐藤です。
> 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
を追加する必要があると思います。
m.yoshida
ご回答ありがとうございます。
理解できました。
もう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 "$@"
スクリプトファイル自体は実行すると作成することは確認してます。
よろしくお願いします。
m.yoshida
at_makoto.sato
2024年3月6日 17時27分
佐藤です。
何点か教えてください。
> コンテナ起動時のみに実行するスクリプトファイル実行する方法としてDockerfileに”ENTRYPOINT”を使おうと思いましたが、コンテナが起動しませんでした。
コンテナ起動時に何かエラーは表示されますでしょうか。
また、 "podman logs <コンテナ名>" を実行した時の表示はどのようになってますでしょうか。
entrypoint.sh ではどのような処理を行っているのでしょうか。
> PID 1はsystemdを使用したいのですが、コンテナ起動時のみの実行するスクリプトファイルのようなことは可能でしょうか?
systemd を使って具体的に何をしたいのかを教えていただければ、適切なアドバイスができると思います。