1

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 rundocker-entrypoint.sh私は、スクリプトが確実にサービスを開始するために使用できる一貫した信頼できる方法があることを望んでいましたdocker run.単一の例を機能させることができないようです。

ここで何が欠けているかについての洞察をいただければ幸いです。

4

2 に答える 2

1

$@ は、コマンド ライン引数の単なる文字列です。何も提供していないため、ヌル文字列を実行しています。それは終了し、ドッカーを殺します。ただし、exec コマンドは実行中のスクリプトを常に終了します。現在のシェルを破棄して新しいシェルを開始し、実行を維持しません。

あなたがやりたいと思うことは、このスクリプトを再帰的な方法で呼び出し続けることです。実際にスクリプト自体を呼び出すには、行は次のようになります。

exec $0

$0 は、bash ファイルの名前 (関数内の場合は関数名) です。この場合、それはスクリプトの名前になります。

また、tail -f /dev/null を使用したくないというあなたの希望に興味がありますか? スクリプトが実行できる限り速く新しいシェルを何度も作成しても、パフォーマンスは向上しません。if 条件を確認するために、このスクリプトを何度も実行する必要があると思います。

その場合、while(1) ループが機能する可能性があります。

于 2019-08-09T01:56:23.713 に答える