web-dev-qa-db-ja.com

既存のDockerコンテナーでコマンドを実行するにはどうすればいいですか?

私は-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.勝てない。

392
Johnston

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)はバックグラウンドで実行され、コンテナーは即時停止にはなりません。

439
Scadge

あなたのコンテナは 終了 あなたがそれに与えたコマンドが終了するので/。以下のオプションを使用してライブにしてください。

  • -i接続されていなくてもSTDINを開いたままにします。
  • -t擬似TTYを割り当てます。

だからあなたの新しいrunコマンドは:

docker run -it -d shykes/pybuilder bin/bash

すでに実行中のコンテナに添付したい場合は、

docker exec -it CONTAINER_ID /bin/bash

これらの例では、/bin/bashがコマンドとして使用されています。

265
cdrev

Katrmrの答えを詳しく説明するために、コンテナが停止していてエラーのために起動できない場合は、それをイメージにcommitする必要があります。その後、新しい画像でbashを起動します。

docker commit [CONTAINER_ID] temporary_image
docker run --entrypoint=bash -it temporary_image
85
Aaron V

だから私は答えが上記の多くの誤解を招くような答えよりも単純だと思います。

停止している既存のコンテナを起動するには

docker start <container-name/ID>

実行中のコンテナを停止する

docker stop <container-name/ID>

それから、コンテナの対話型シェルにログインする

docker exec -it <container-name/ID> bash
74
Peter T.

ここでの答えのいくつかは、実行されているのであって停止されていないコンテナに関するものであるため、誤解を招く可能性があります。

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)アプローチでもうまくいかないと思います。引数を停止したコンテナに変更することはできないからです。)

38
katrmr

コマンドを実行するには、bash -cを使用しなければなりませんでした。 docker exec -it CONTAINER_ID bash -c "mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql"

16
velop

コンテナを作成し、それにコマンドを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
13

これは、上記の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"

それがすべてです。

7
imriss

コマンドを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
2
MrKulli

残念ながら、この目標を達成するためにENTRYPOINTdocker run --entrypointを持つ引数でオーバーライドすることは不可能です。

注:--entrypointを使用してENTRYPOINT設定をオーバーライドすることができますが、これはバイナリをexecにのみ設定できます(sh -cは使用されません)。

2
wieczorek1990

イメージがデフォルトのエントリポイント/bin/sh -cを使用していると仮定すると、/bin/bashを実行するとデーモンモード(-d)で直ちに終了します。このコンテナでインタラクティブシェルを実行したい場合は、-itの代わりに-dを使用してください。通常別のプロセスを実行しているコンテナ内で任意のコマンドを実行したい場合は、nsenterまたはnsinitを試すとよいでしょう。詳細については https://blog.codecentric.de/en/2014/07/enter-docker-container/ をご覧ください。

2
Andreas Steffan

私はこれを私の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
1
Ângelo Polotto

私はwindowsコンテナを実行しています、そして作成されコピーされたファイルとフォルダのためにdockerコンテナの中を見る必要があります。

そのためには、以下のdocker entrypointコマンドを使用して、コマンドプロンプトをコンテナ内で実行するか、コンテナにアタッチします。

ENTRYPOINT ["C:\\Windows\\System32\\cmd.exe", "-D", "FOREGROUND"]

これは、Prompt attach to containerと、コンテナーをライブに保つコマンドの両方に役立ちました。 :)

0
Jenish Rabadiya

Mac用:

$ docker exec -it <container-name> sh

rootユーザーとして接続したい場合は、

$ docker exec -u 0 -it <container-name> sh
0
Lyncean Patel

簡単な答え:同時に起動して添付してください。この場合、あなたはまさにあなたが求めたことをしています。

docker start <CONTAINER_ID/CONTAINER_NAME> && docker attach <CONTAINER_ID/CONTAINER_NAME> 

<CONTAINER_ID/CONTAINER_NAME>を必ず変更してください

0
user353305
# docker exec -d container_id command 

例:

# docker exec -d xcdefrdtt service jira stop 
0
Rajesh Gurram