web-dev-qa-db-ja.com

Dockerfile CMD命令は、実行直後にコンテナを終了します

コンテナーの起動時にいくつかの構成をセットアップしたいので、シェルスクリプトを使用しています。ただし、スクリプトが終了するとすぐにコンテナが終了します。-dフラグ/切り離しモードで試しましたが、切り離しモードで実行されることはありません。

以下は私のDockerfileです

FROM ubuntu:14.04

ADD Shell.sh /usr/local/bin/Shell.sh

RUN chmod 777 /usr/local/bin/Shell.sh

CMD /usr/local/bin/Shell.sh

以下は私のシェルスクリプトです

#!/bin/bash
echo Hello-docker
  1. フラグなしで実行

    docker run hello-docker
    

    これにより、コンソールに「Hello-docker」と表示されて終了します

  2. -itdフラグを使用して実行

    docker run -itd hello-docker
    

    コンソール出力の下にあるように、この時間もすぐに終了します。 :(enter image description here

    • 私が見た違いは、他のイメージを実行するときのコマンドセクションにあります。コマンドセクションに「/ bin/bash」と表示され、分離モードで続行されます。

    • そして、シェルスクリプトのコマンドセクションでコンテナ内のイメージを実行すると、「/ bin/sh -c/usr/loca」が表示され、終了します。

    • 手動で停止しないまでコンテナを実行したい。

編集:

DockerfileにENTRYPOINT命令を追加した後、これはシェルスクリプトを実行しません:(

FROM ubuntu:14.04

ADD Shell.sh /usr/local/bin/Shell.sh

RUN chmod 777 /usr/local/bin/Shell.sh

CMD /usr/local/bin/Shell.sh

ENTRYPOINT /bin/bash

ドッカーのドキュメントによると here

代替引数を使用してコンテナを実行するとCMDが上書きされるため、以下のように引数を指定してdocker imageを実行すると、CMD命令は実行されません。 :(

Sudo docker run -it --entrypoint=/bin/bash <imagename>
32
Anand Suthar

最後にいくつかの実験で、以下のように最高の結果を得ました

私のDockerfileには何も問題はありません。それは以下のとおりです。

FROM ubuntu:14.04

ADD Shell.sh /usr/local/bin/Shell.sh

RUN chmod 777 /usr/local/bin/Shell.sh

CMD /usr/local/bin/Shell.sh

期待される結果を得るために行うことは、次のようにシェルスクリプトファイルにもう1つのコマンド(/ bin/bash)を追加するだけで、すべてが最善の方法で機能することです。

#!/bin/bash

echo “Hello-docker” > /usr/hello.txt

/bin/bash
18
Anand Suthar

DockerfileのCMDが取得する限り、Dockerコンテナが実行されます。

あなたの場合、CMDは単一のエコーを含むシェルスクリプトで構成されています。そのため、エコーの完了後にコンテナは終了します。

CMDをオーバーライドできます。例:

Sudo docker run -it --entrypoint=/bin/bash <imagename>

これにより、CMDを実行する代わりに、コンテナでインタラクティブシェルが開始されます。シェルは、シェルを終了するとすぐに終了します。

コンテナをアクティブなままにする場合は、CMDが実行され続けることを確認する必要があります。たとえば、Shell.shファイルにwhile true; do sleep 1; doneという行を追加すると、コンテナーはhelloメッセージを出力し、停止するまで(別のターミナルでdocker stopを使用して)何もしません。

docker exec -it <containername> bashを使用して、実行中のコンテナでシェルを開くことができます。その後、コマンドps axを実行すると、Shell.shがまだコンテナー内で実行されていることがわかります。

19
NZD

最初のDockerfileを変更して置き換えることもできます

CMD /usr/local/bin/Shell.sh

沿って

CMD /usr/local/bin/Shell.sh ; sleep infinity

そうすれば、スクリプトは終了せず、コンテナは実行されたままになります。

15
user2915097
CMD bash -C '/path/to/start.sh';'bash'
2
lanni654321

開始時にシェルは行コードを追加します:tail -f /dev/nullまたは/bin/bashは、Shellが完了したことを確認し、Dockerコンテナがシャットダウンしないようにシステムでプロセスを一時停止します。「chmod + x」を忘れずにstart.shへのアクセス。デモがあります:

#!/bin/bash
cp /root/supervisor/${RUN_SERVICE}.ini /etc/supervisor/conf.d/
sleep 1
service supervisor start
/bin/bash
1
ghostyusheng