web-dev-qa-db-ja.com

シェルスクリプトを使用してdockerコンテナ内でスクリプトを実行する

私はDockerテクノロジに不慣れで、dockerコンテナを設定するためのシェルスクリプトを作成しようとしています。スクリプトファイルは次のようになります。

#!bin/bash

docker run -t -i -p 5902:5902 --name "mycontainer" --privileged myImage:new /bin/bash

このスクリプトファイルを実行すると、新しく起動されたbashでコンテナが実行されます。

今、私はすでに上記の与えられたシェルスクリプトからコンテナ内にあるスクリプトファイル(test.sh)を実行する必要があります(例:cd /path/to/test.sh && ./test.sh)どのようにするか、どうぞシナリオが明確でない場合は、気軽に質問してください。

58
zappy

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]を使用して、実行中のコンテナでコマンドを実行できます。

docker exec mycontainer /path/to/test.sh

そしてbashセッションから実行するには:

docker exec -it mycontainer /bin/bash

そしてそこからあなたはあなたのスクリプトか何かを実行することができます。

81

Dockerコンテナが起動していて実行中であると仮定して、以下のようにコマンドを実行できます。

docker exec mycontainer /bin/sh -c "cmd1;cmd2;...;cmdn"
75
Cyclops

私はこれと同じ質問の答えを探していて、DockerfileソリューションでENTRYPOINTを見つけました。

Dockerfile

...
ENTRYPOINT /my-script.sh ; /my-script2.sh ; /bin/bash

これで、コンテナを起動したときにスクリプトが実行され、スクリプトの実行後にbashプロンプトが表示されます。

9
tojo

ローカルディレクトリをdockerイメージにマウントして、スクリプトを.bashrcに読み込むこともできます。スクリプトをすべての新しいシェルで実行したい場合を除き、スクリプトは関数で構成されている必要があります。 (これは古くなっていますが更新通知を見てください。)

Dockerインスタンスの外部でスクリプトを更新できるようにするために、このソリューションを使用しています。こうすれば、変更があった場合にイメージを再実行する必要はなく、新しいシェルを開くだけです。 (シェルを再び開くのをやめました - 更新通知を見てください)

現在のディレクトリをバインドする方法は次のとおりです。

docker run -it -v $PWD:/scripts $my_docker_build /bin/bash

これであなたの現在のディレクトリはあなたのdockerインスタンスの/scriptsにバインドされます。

(古い).bashrcの変更を保存するには、次のコマンドで作業イメージをコミットします。

docker commit $container_id $my_docker_build

更新

すべての変更に対して新しいシェルを開くという問題を解決するために、次の手順を実行します。

Dockerfile自体にRUN echo "/scripts/bashrc" > /root/.bashrc"を追加します。 zshrcの内側のscriptsディレクトリをパスにエクスポートします。 scriptsディレクトリに、1つではなく複数のファイルが含まれるようになりました。これで、すべてのスクリプトを変更するたびにサブシェルを開かなくても、すべてのスクリプトを直接呼び出すことができます。

ところであなたもあなたのコンテナの外に履歴ファイルを定義することができます。こうすれば、bashの変更をコミットする必要がなくなります。

4
Devpool

エントリポイントも見てください。あなたは複数のCMDを使うことができるでしょう https://docs.docker.com/engine/reference/builder/#/entrypoint

1
Boris

複数のインスタンスで同じコマンドを実行したい場合は、次のようにします。

for i in c1 dm1 dm2 ds1 ds2 gtm_m gtm_sl; do docker exec -it $i /bin/bash -c "service sshd start"; done
0
DMin