Closed8

dockerイメージでshellscriptでdaemonするときのexecだかsignalだかのやつ

inomotoinomoto

やむを得ずコンテナのデフォルトのentrypointとかcmdではなくshellscript経由で起動せざるを得なくなった。
その時にshellscriptの最後のコマンドを起動する際、なんかexecでやらないとダメだった気がしたけど覚えてなかったのでざっと確認。

inomotoinomoto

タイトルの「daemonするとき」ってなんか違う気がするけどいいか。

inomotoinomoto

問題はコンテナ外部からシグナルを送りたいときに、目的のプロセスに届かないとかそんなだったはず。

で、コンテナでシグナルの挙動を見るときに使うコンテナといえば、これ。
https://toris.io/2020/05/everlasting-hey-yo/

まずは通常動作を試す。

$ docker run --rm --name hey public.ecr.aws/toricls/everlasting-hey-yo

別シェルで docker stop hey して

$ docker run --rm --name hey public.ecr.aws/toricls/everlasting-hey-yo
Hey, Yo!
Hey, Yo!
Hey, Hey, Hey, Yo!!!
Hey, Yo!
Hey, Yo!
Hey, Yo!
Hey, Yo!
Hey, Yo!
Hey, Yo!
Hey, Yo!
Hey, Yo!
Hey, Yo!
Hey, Yo!

Hey, Hey, Hey, Yo!!!が出るのでヨシ

inomotoinomoto

次にexecなしで試す。

Dockerfile
FROM public.ecr.aws/toricls/everlasting-hey-yo

COPY ./entry.sh /entry.sh
RUN chmod +x /entry.sh

ENTRYPOINT ["/entry.sh"]
entry.sh
#!/bin/sh

/hey-yo.sh
inomotoinomoto
$ docker build . -t yo
$ docker run --rm --name hey yo
Hey, Yo!
Hey, Yo!
Hey, Yo!
Hey, Yo!
Hey, Yo!
Hey, Yo!
Hey, Yo!
Hey, Yo!
Hey, Yo!
Hey, Yo!
Hey, Yo!
Hey, Yo!
Hey, Yo!
Hey, Yo!

※途中で同じようにstopを実行している

SIGTERMもらえてない。

inomotoinomoto

execを入れる。

entry.sh
#!/bin/sh

exec /hey-yo.sh

Dockerfileは同じ。

inomotoinomoto
$ docker build . -t yoyo
$ docker run --rm --name hey yoyo
Hey, Yo!
Hey, Yo!
Hey, Hey, Hey, Yo!!!
Hey, Yo!
Hey, Yo!
Hey, Yo!
Hey, Yo!
Hey, Yo!
Hey, Yo!
Hey, Yo!
Hey, Yo!
Hey, Yo!
Hey, Yo!

SIGTERM入ってそう。

このスクラップは2024/01/21にクローズされました