348

私は単純に、このコマンドが実行中のコンテナーで bash シェルを実行することを期待していました。

docker run "id of running container" /bin/bash

それは不可能のようです、私はエラーが発生します:

2013/07/27 20:00:24 Internal server error: 404 trying to fetch remote history for 27d757283842

したがって、実行中のコンテナーで bash シェルを実行したい場合 (例: 診断目的)

その中でSSHサーバーを実行し、ssh経由でログインする必要がありますか?

4

15 に答える 15

291

編集:これで使用できますdocker exec -it "id of running container" bashdoc

以前は、この質問に対する答えは次のとおりでした。

本当に必要で、デバッグ環境にいる場合は、これを行うことができます: sudo lxc-attach -n <ID> ID は完全なもの ( docker ps -notrunc) である必要があることに注意してください。

ただし、これには強くお勧めしません。

注意:は非推奨です。まもなく-notrunc置き換えられます。--no-trunc

于 2013-07-29T18:54:06.453 に答える
15

やるだけ

docker attach container_name

コメントで述べたように、コンテナーを停止せずにコンテナーからデタッチするには、Ctrlpthenと入力しCtrlqます。

于 2014-05-12T09:59:23.843 に答える
10

状況は変化しているため、現時点で実行中のコンテナーにアクセスする推奨される方法は、 を使用することnsenterです。

詳細については、このgithub リポジトリを参照してください。しかし、一般的に、次のように nsenter を使用できます。

PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid

またはラッパーを使用できますdocker-enter

docker-enter <container_name_or_ID>

このトピックに関する適切な説明は、Jérôme Petazzoni のブログ エントリにあります: docker コンテナー で sshd を実行する必要がない理由

于 2014-08-20T07:23:37.497 に答える
8

まず実行できないこと

docker run "existing container" command

このコマンドはコンテナではなく画像を想定しているため、いずれにせよ新しいコンテナが生成されます (見たいコンテナではありません)。

docker では、別の方法で考えるように自分自身をプッシュする必要があるという事実に同意します (したがって、コンテナーにログオンする必要がないように方法を見つける必要があります)。その周りに。

DEAMON モードでスーパーバイザーを介してコマンドを実行します。

次に、私が呼んでいるものを実行しますdocker_loop.sh 。内容はほとんど次のとおりです。

#!/bin/bash
/usr/bin/supervisord
/usr/bin/supervisorctl
while ( true )
    do
    echo "Detach with Ctrl-p Ctrl-q. Dropping to shell"
    sleep 1
    /bin/bash
done

それが行うことは、コンテナに「アタッチ」し、supervisorctl停止/開始/再起動してログを確認するためのインターフェイスを提示できるようにすることです。それでも十分でないCtrl+D場合は、通常のシステムであるかのように覗き見できるシェルにドロップすることができます。

このシステムは、シェルのないコンテナを使用する場合ほど安全ではないことも考慮してください。そのため、コンテナを保護するために必要なすべての手順を実行してください。

于 2014-01-05T10:21:04.983 に答える
5

このプル リクエストに注目してください: https://github.com/docker/docker/pull/7409

これは、今後のdocker exec <container_id> <command>ユーティリティを実装します。これが利用可能になると、実行中のコンテナー内で ssh サービスを開始および停止することが可能になります。

これを行うこともありnsinitます:「nsinitは、実行中のコンテナの名前空間内のシェルにアクセスする便利な方法を提供します」しかし、実行するのは難しいようです。 https://gist.github.com/ubergarm/ed42ebbea293350c30a6

于 2014-09-03T11:01:08.213 に答える
3

使用できます

docker exec -it <container_name> bash
于 2018-05-09T00:36:14.597 に答える
2

これが私の解決策です

Dockerfile で:

# ...
RUN mkdir -p /opt
ADD initd.sh /opt/
RUN chmod +x /opt/initd.sh
ENTRYPOINT ["/opt/initd.sh"]

initd.shファイル内

#!/bin/bash
...
/etc/init.d/gearman-job-server start
/etc/init.d/supervisor start
#very important!!!
/bin/bash

イメージがビルドされた後、execまたはを使用して 2 つのオプションがありますattach

  1. exec (推奨) を使用して実行します。

    docker run --name $CONTAINER_NAME -dt $IMAGE_NAME
    

    それから

    docker exec -it $CONTAINER_NAME /bin/bash
    

    CTRL+を使用Dしてデタッチします

  2. アタッチして実行を使用します。

    docker run --name $CONTAINER_NAME -dit $IMAGE_NAME
    

    それから

    docker attach $CONTAINER_NAME
    

    CTRL+PCTRL+を使用Qしてデタッチします

    :オプションの違いはパラメータにあります-i

于 2014-11-26T09:36:07.733 に答える
1

2 つの方法があります。

アタッチメント付き

$ sudo docker attach 665b4a1e17b6 #by ID

エグゼクティブ付き

$ sudo docker exec - -t 665b4a1e17b6 #by ID
于 2016-03-29T18:41:29.467 に答える
-2

私のように、コンテナーを開発するときに VM の観点から考えるように誤解されたのかもしれません。私のアドバイス:そうしないようにしてください。

コンテナは他のプロセスと同じです。実際、デバッグ目的でそれらに「アタッチ」したい場合があります ( /proc//env または strace -p を考えてください) が、それは非常に特殊なケースです。

通常はプロセスを「実行」するだけなので、構成を変更したりログを読み取ったりする場合は、新しいコンテナーを作成し、ディレクトリを共有して stdout に書き込むことでコンテナーの外にログを書き込むようにしてください (docker ログが機能するように)。またはそのようなもの。

デバッグの目的で、シェルを開始してからコードを開始し、CTRL-p + CTRL-q を押してシェルをそのままにしておくことができます。このようにして、次を使用して再接続できます。

docker attach <container_id>

コンテナが予期しないことを行っているためにコンテナをデバッグしたい場合は、デバッグしてみてください: https://serverfault.com/questions/596994/how-can-i-debug-a-docker-container -初期化

于 2014-05-26T09:08:27.430 に答える
-4

いいえ、できません。supervisord必要に応じて、ssh サーバーを取得するなどの方法を使用してください。とはいえ、私は間違いなくその必要性に疑問を抱いています。

于 2013-07-28T18:48:51.987 に答える