コンテナを永続化させる方法

コンテナは起動後、実行しているプロセスがなかったら停止してしまいます。

そのため、例えば apache を起動するコンテナだと、
DokerFile で、

CMD ["/usr/sbin/httpd","-D", "FOREGROUND"]

と指定したり、スクリプト中で実行する場合は、

ENTRYPOINT ["entrypoint.sh"]

として、 entrypoint.sh 中で、

/usr/sbin/httpd -D FOREGROUND

としたりします。
(apache を FOREGROUND で起動することで、プロセスが落ちないようにしている、と思う。)

上記のように、FOREGROUND で起動する事ができない場合は、tail -f /dev/null を使うといいです。

例えば、 entrypoint.sh で下記のように最後に書きます。

〜
いろんな処理
〜

tail -f /dev/null

こうすることで、entrypoint.sh を実行するプロセスが落ちないので、コンテナは停止せずに起動中のままになります。

もしくは、 tty オプションを使います。
docker-compose だと、下記のように tty: true と指定することで有効にします。

version: "3"
services:
  test:
    container_name: "test"
    build:
      context: ./
    ports:
      - 80:80
    privileged: true
    tty: true
    volumes:
      - "./:/data"
    environment:
      TZ: 'Asia/Tokyo'

これは、 docker run コマンドの t オプションに相当し、docker コマンドでは下記のように実行することで、 tty が有効になります。

$ docker run --name test -it debian

-it についてくわしくは こちら

tty を指定するほうが良いのか、 tail -f /dev/null を指定するほうが良いのか、どちらでも良いように思いますが、 tail -f /dev/null だと、実行時のオプションに関わらず、プロセスが落ちないようにすることができます。