475

これまで読んだチュートリアルによると、 use " docker run -d" はイメージからコンテナーを開始し、コンテナーはバックグラウンドで実行されます。これはどのように見えるかで、すでにコンテナ ID を持っていることがわかります。

root@docker:/home/root# docker run -d centos
605e3928cdddb844526bab691af51d0c9262e0a1fc3d41de3f59be1a58e1bd1d

しかし、" docker ps" を実行すると、何も返されませんでした。

" " を試してみたところdocker ps -a、コンテナが既に終了していることがわかります。

root@docker:/home/root# docker ps -a
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS                         PORTS               NAMES
605e3928cddd        centos:latest         "/bin/bash"         31 minutes ago      Exited (0) 31 minutes ago                          kickass_swartz

私が間違ったことはありますか?この問題のトラブルシューティング方法を教えてください。

4

20 に答える 20

705

centos dockerfileにはデフォルトのコマンドがありますbash

つまり、バックグラウンドで実行すると ( -d)、シェルはすぐに終了します。

2017年更新

最近のバージョンの docker では、デタッチ モード フォアグラウンド モードの両方でコンテナーを実行することを承認します( -t-iまたは-it) 。

その場合、追加のコマンドは必要なく、これで十分です。

docker run -t -d centos

bash はバックグラウンドで待機します。
それは最初にkalyani-chaudhari回答で報告され、ジャージービーン回答で詳しく説明されました。

vonc@voncvb:~$ d ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
4a50fd9e9189        centos              "/bin/bash"         8 seconds ago       Up 2 seconds                            wonderful_wright

alpineについては、Marinos Anがコメントで報告していることに注意してください。

docker run -t -d alpine/gitプロセスを維持しません。
しなければならなかった:docker run --entrypoint "/bin/sh" -it alpine/git


元の回答 (2015)

この記事で述べたように:

で実行する代わりに、コマンド 1 つだけでコンテナーを実行でき、 + +を押してコンテナーのターミナルを切り離す必要がないためdocker run -i -t image your-command、 を使用することをお勧めします。-dCtrlPQ

ただし、オプションに問題があり-dます。コマンドがフォアグラウンドで実行され続けない限り、コンテナはすぐに停止します
Docker では、コマンドをフォアグラウンドで実行し続ける必要があります。そうしないと、アプリケーションが停止してコンテナーをシャットダウンしたと見なされます。

問題は、一部のアプリケーションがフォアグラウンドで実行されないことです。どうすれば簡単にできるでしょうか?

この状況ではtail -f /dev/null、コマンドに追加できます。
これにより、main コマンドがバックグラウンドで実行されても、テールがフォアグラウンドで実行され続けるため、コンテナーが停止することはありません。

したがって、これは機能します:

docker run -d centos tail -f /dev/null

または Dockerfile で:

ENTRYPOINT ["tail"]
CMD ["-f","/dev/null"]

Adocker psは、centos コンテナーがまだ実行中であることを示します。

そこから、それに接続したり、そこから切り離したりできます(またはdocker execいくつかのコマンド)。

于 2015-05-13T08:51:05.013 に答える
83

この回答によると、フラグを追加する-tと、バックグラウンドで実行されているときにコンテナーが終了しなくなります。その後、 を使用docker exec -i -t <image> /bin/bashしてシェル プロンプトに入ることができます。

docker run -t -d <image> <command>

-t オプションはあまりよく文書化されていないようですが、ヘルプには「疑似 TTY を割り当てる」と書かれています。

于 2016-07-22T10:42:32.823 に答える
21

こんにちは、この問題は、コンテナー内に実行中のアプリケーションがない場合、docker コンテナーが終了するためです。

-d 

オプションは、コンテナーをデーモン モードで実行することだけです。

したがって、コンテナーを継続的に実行するための秘訣は、アプリケーションを実行し続ける docker のシェル ファイルを指すことです。start.sh ファイルで試すことができます。

Eg: docker run -d centos sh /yourlocation/start.sh

この start.sh は、終わりのないアプリケーションを指している必要があります。

アプリケーションを実行したくない場合はmonit、docker コンテナーを実行し続けるようにインストールできます。これら 2 つのケースがコンテナの実行を維持するのに役立ったかどうかをお知らせください。

ではごきげんよう

于 2015-05-13T08:50:40.927 に答える
5

たぶんそれは私だけですが、CentOS 7.3.1611 と Docker 1.12.6 では、@VonC と @Christopher Simon によって投稿された回答を組み合わせて、これを確実に機能させる必要がありました。CMDが正常に実行された後、コンテナが終了するのを止める前に私がしたことは何もありませんでした。oracle-xe-11Gr2 と sshd を開始しています。

Dockerfile

...
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N '' && systemctl enable sshd
...
CMD /etc/init.d/oracle-xe start && /sbin/sshd && tail -f /dev/null

次に、 -d -t および -i を追加して実行します

docker run --shm-size=2g --name oracle-db -d -t -i -p 5022:22 -p 5080:8080 -p 1521:1521 centos-oracle:7.3.1611 

何時間も頭を壁にぶつけた後、ついに

ssh -v root@127.0.0.1 -p 5022
...
root@127.0.0.1's password: 
debug1: Authentication succeeded (password).

何らかの理由で、tail -f が削除された場合、または -t -d -i オプションのいずれかが省略された場合、CMD の実行後に上記が終了します。

于 2017-05-01T15:40:52.997 に答える
5

Dockerfile の最後で CMD を使用している場合、できることはコードを最後に追加することです。これは、docker が ubuntu または bash を使用できる OS 上に構築されている場合にのみ機能します。

&& /bin/bash

簡単に言うと、Dockerfile の末尾は次のようになります。

...

CMD ls && ... && /bin/bash

そのため、docker イメージを実行した後に何かが自動的に実行されている場合、タスクが完了すると、bash ターミナルが docker 内でアクティブになります。これにより、シェル コマンドを入力できます。

于 2019-07-25T19:50:51.037 に答える
1

私も同じ問題に直面していましたが、別の方法でした。Dockerコンテナを作成するとき。バックグラウンドで実行されている未使用のコンテナを自動的に停止します。使用中のコンテナを停止することもあります。私の状況では、これは以前に持っていた docker.sock ファイルの許可によるものです。あなたがしなければならないことは:-

  1. docker を再度インストールします (ubuntu で作業しているので、ここからインストールします) 。

  2. コマンドを実行して権限を変更します。

    sudo chmod 666 /var/run/docker.sock

  3. docker-compose をインストールします (多くのコンテナーを一緒に作成するための構成ファイルがあるため、これはオプションです)

    sudo curl -L "https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

    sudo chmod +x /usr/local/bin/docker-compose

  4. バージョンをチェックして、最新のものを使用していることを確認し、一部の非推奨事項で問題が発生しないようにします。

  5. 次に、docker コンテナーのビルドを実行します。

于 2021-06-20T08:33:54.643 に答える