Docker コンテナのエントリポイントとして bash スクリプトを使用する動作バージョンを理解または確認するのに問題があります。私は今、約5時間にわたって多くのことを試してきました。
このDocker 公式ブログからでも、bash スクリプトをエントリ ポイントとして使用しても機能しません。
Dockerfile
FROM debian:stretch
COPY docker-entrypoint.sh /usr/local/bin/
RUN ln -s /usr/local/bin/docker-entrypoint.sh / # backwards compat
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["postgres"]
docker-entrypoint.sh
#!/bin/bash
set -e
if [ "$1" = 'postgres' ]; then
chown -R postgres "$PGDATA"
if [ -z "$(ls -A "$PGDATA")" ]; then
gosu postgres initdb
fi
exec gosu postgres "$@"
fi
exec "$@"
build.sh
docker build -t test .
run.sh
docker service create \
--name test \
test
多くの努力にもかかわらず、継続的に再起動せず、繰り返し失敗する bash スクリプトとして Entrypoint を使用して Dockerfile を取得できないようです。
私の理解ではexec "$@"
、コンテナフォームをすぐに終了させておくと想定されていましたが、それがスクリプト内の他のプロセスの失敗に依存しているかどうかはわかりません。
docker-entrypoint.sh
次のような単純なスクリプトを使用してみました。
#!/bin/bash
exec "$@"
それも失敗したので、失敗の原因であるスクリプト内で何か他のことがうまくいかないことを除外すると思います。
また、イライラするのは、docker service logs test
またはからのログがなくdocker logs [container_id]
、 で役立つものが見つからないようですdocker inspect [container_id]
。
に対するみんなの信頼を理解するのに苦労していexec "$@"
ます。tail -f /dev/null
のようなものを使用したり、でコマンドを使用したりしたくありませんdocker run
。docker-entrypoint.sh
私は、スクリプトが確実にサービスを開始するために使用できる一貫した信頼できる方法があることを望んでいましたdocker run
.単一の例を機能させることができないようです。
ここで何が欠けているかについての洞察をいただければ幸いです。