コンテナーの起動時にいくつかの構成をセットアップしたいので、シェルスクリプトを使用しています。ただし、スクリプトが終了するとすぐにコンテナが終了します。-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
フラグなしで実行
docker run hello-docker
これにより、コンソールに「Hello-docker」と表示されて終了します
-itdフラグを使用して実行
docker run -itd hello-docker
コンソール出力の下にあるように、この時間もすぐに終了します。 :(
私が見た違いは、他のイメージを実行するときのコマンドセクションにあります。コマンドセクションに「/ 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>
最後にいくつかの実験で、以下のように最高の結果を得ました
私の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
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がまだコンテナー内で実行されていることがわかります。
最初のDockerfileを変更して置き換えることもできます
CMD /usr/local/bin/Shell.sh
沿って
CMD /usr/local/bin/Shell.sh ; sleep infinity
そうすれば、スクリプトは終了せず、コンテナは実行されたままになります。
CMD bash -C '/path/to/start.sh';'bash'
開始時にシェルは行コードを追加します: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