私は-d
でコンテナーを作成したので対話的ではありません。
docker run -d shykes/pybuilder bin/bash
コンテナが終了したのがわかります。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d6c45e8cc5f0 shykes/pybuilder:latest "bin/bash" 41 minutes ago Exited (0) 2 seconds ago clever_bardeen
今私はマシン上で時折コマンドを実行して終了したいと思います。応答を得るためだけに。
私は機械を始動させようとしました。付けてみました。私はコンテナでrun
を呼び出せると思いましたが、それは許されないようです。 start
を使うことはただ実行してすぐに存在するようです。
終了後に対話モードに戻りたいのですが。
私は試した:
docker attach d6c45e8cc5f0
しかし、私は得ます:
2014/10/01 22:33:34 You cannot attach to a stopped container, start it first
しかし、私が始めれば、それはとにかく終了します。キャッチ22.勝てない。
2014年10月、 Dockerチームがdocker exec
コマンドを導入しました : https://docs.docker.com/engine/reference/commandline/exec/
そのため、ID(または名前)を知っているだけで、実行中のコンテナで任意のコマンドを実行できます。
docker exec -it <container_id_or_name> echo "Hello from container!"
exec
コマンドは、すでに実行中のコンテナに対してのみ機能します。コンテナーが現在停止している場合は、まず次のコマンドを使用してコンテナーを実行する必要があります。
docker run -it -d shykes/pybuilder /bin/bash
ここで最も重要なことは、detached
を表す-d
オプションです。つまり、最初にコンテナーに提供したコマンド(/bin/bash
)はバックグラウンドで実行され、コンテナーは即時停止にはなりません。
あなたのコンテナは 終了 あなたがそれに与えたコマンドが終了するので/。以下のオプションを使用してライブにしてください。
-i
接続されていなくてもSTDINを開いたままにします。-t
擬似TTYを割り当てます。だからあなたの新しいrun
コマンドは:
docker run -it -d shykes/pybuilder bin/bash
すでに実行中のコンテナに添付したい場合は、
docker exec -it CONTAINER_ID /bin/bash
これらの例では、/bin/bash
がコマンドとして使用されています。
Katrmrの答えを詳しく説明するために、コンテナが停止していてエラーのために起動できない場合は、それをイメージにcommit
する必要があります。その後、新しい画像でbashを起動します。
docker commit [CONTAINER_ID] temporary_image
docker run --entrypoint=bash -it temporary_image
だから私は答えが上記の多くの誤解を招くような答えよりも単純だと思います。
停止している既存のコンテナを起動するには
docker start <container-name/ID>
実行中のコンテナを停止する
docker stop <container-name/ID>
それから、コンテナの対話型シェルにログインする
docker exec -it <container-name/ID> bash
ここでの答えのいくつかは、実行されているのであって停止されていないコンテナに関するものであるため、誤解を招く可能性があります。
Sven Dowideit氏はDockerフォーラムで、コンテナはそのプロセスに縛られていると説明した(そしてDockerは停止したコンテナのプロセスを変更することはできない。少なくとも内部構造のせいで: https://github.com/docker/docker/issues/1437 )そのため、基本的に唯一のオプションは、コンテナを画像にcommit
し、別のコマンドを使用してrun
することです。
https://forums.docker.com/t/run-command-in-stopped-container/343 を参照してください。
(引数付きのENTRYPOINT
)アプローチでもうまくいかないと思います。引数を停止したコンテナに変更することはできないからです。)
コマンドを実行するには、bash -cを使用しなければなりませんでした。 docker exec -it CONTAINER_ID bash -c "mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql"
コンテナを作成し、それにコマンドを1つずつ送信します。
docker create --name=my_new_container -it ubuntu
docker start my_new_container
// ps -a says 'Up X seconds'
docker exec my_new_container /path/to/my/command
// ps -a still says 'Up X+Y seconds'
docker exec my_new_container /path/to/another/command
これは、上記のCDR LDN回答と here で見つけた回答を組み合わせたものです。
次の例ではArch Linuxコンテナをイメージから起動し、git
ツールを使ってそのコンテナにpacman
をインストールします。
Sudo docker run -it -d archlinux /bin/bash
Sudo docker ps -l
Sudo docker exec -it [container_ID] script /dev/null -c "pacman -S git --noconfirm"
それがすべてです。
コマンドをstdinにパイプ処理します
-t
を削除する必要があります。
echo 'touch myfile' | Sudo docker exec -i CONTAINER_NAME bash
CLIオプションを使用すると便利な場合があります。
でテスト済み:
Sudo docker run --name ub16 -it ubuntu:16.04 bash
それから別のシェルで:
echo 'touch myfile' | Sudo docker exec -i ub16 bash
それから最初のシェルで:
ls -l myfile
docker 1.13.1、Ubuntu 16.04ホスト上。
あなたがシェルスクリプトを実行しようとしているなら、あなたはbashとしてそれを実行する必要があります(velopの回答に基づく)。
docker exec -it containerid bash -c /path/to/your/script.sh
残念ながら、この目標を達成するためにENTRYPOINT
をdocker run --entrypoint
を持つ引数でオーバーライドすることは不可能です。
注:--entrypointを使用してENTRYPOINT設定をオーバーライドすることができますが、これはバイナリをexecにのみ設定できます(sh -cは使用されません)。
イメージがデフォルトのエントリポイント/bin/sh -c
を使用していると仮定すると、/bin/bash
を実行するとデーモンモード(-d
)で直ちに終了します。このコンテナでインタラクティブシェルを実行したい場合は、-it
の代わりに-d
を使用してください。通常別のプロセスを実行しているコンテナ内で任意のコマンドを実行したい場合は、nsenter
またはnsinit
を試すとよいでしょう。詳細については https://blog.codecentric.de/en/2014/07/enter-docker-container/ をご覧ください。
私はこれを私のnode-redコンテナ用に作り、私の問題を解決しました:
NODEREDNAME=mynodered
# Create a new node red container
docker run -it -p 1880:1880 -v "$(pwd)/data":/data --name $NODEREDNAME -d nodered/node-red-docker
# Open a Shell in the container (THAT ANSWERS THE QUESTION)
docker exec -it $NODEREDNAME bash -c "cd /data & npm install node-red-node-mongodb"
# Restart the container to load the new nodes
docker stop $NODEREDNAME
docker start $NODEREDNAME
私はwindowsコンテナを実行しています、そして作成されコピーされたファイルとフォルダのためにdockerコンテナの中を見る必要があります。
そのためには、以下のdocker entrypointコマンドを使用して、コマンドプロンプトをコンテナ内で実行するか、コンテナにアタッチします。
ENTRYPOINT ["C:\\Windows\\System32\\cmd.exe", "-D", "FOREGROUND"]
これは、Prompt attach to containerと、コンテナーをライブに保つコマンドの両方に役立ちました。 :)
Mac用:
$ docker exec -it <container-name> sh
rootユーザーとして接続したい場合は、
$ docker exec -u 0 -it <container-name> sh
簡単な答え:同時に起動して添付してください。この場合、あなたはまさにあなたが求めたことをしています。
docker start <CONTAINER_ID/CONTAINER_NAME> && docker attach <CONTAINER_ID/CONTAINER_NAME>
<CONTAINER_ID/CONTAINER_NAME>
を必ず変更してください
# docker exec -d container_id command
例:
# docker exec -d xcdefrdtt service jira stop