DockerComposeはコンテナーを実行し続けます


101

docker-composeを使用してサービスを開始し、コンテナーを実行し続けて、「dockerinspect」を介してIPアドレスを取得できるようにします。ただし、コンテナは常に起動直後に終了します。

docker-compose.ymlに "command:[" sleep "、" 60 "]"などを追加しようとしましたが、 "command:..."の行を追加するたびに、 "docker-composeup"を呼び出すことができません。 「コンテナを開始できません.....システムエラー:値の先頭を探している無効な文字 'k'」というメッセージが表示されるので

また、Dockerfile自体に「CMDsleep60」などを追加してみましたが、これらのコマンドが実行されていないようです。

コンテナを存続させたり、問題の1つを修正したりする簡単な方法はありますか?

編集:これが私が実行したい作成ファイルです:

version: '2'
services:
  my-test:
    image: ubuntu
    command: bash -c "while true; do echo hello; sleep 2; done"

OS Xでdocker-composeでこれを開始すると正常に動作しますが、Ubuntu 16.04で同じことを試みると、上記のエラーメッセージが表示されます。

Dockerfileを使用してアプローチを試みると、Dockerfileは次のようになります。

FROM ubuntu:latest
CMD ["sleep", "60"]

何もしていないようです

編集2:自分で修正する必要があります。Dockerfileとdocker-compose.ymlでも同じ問題であることがわかりました。Dockerfileに「CMD ...」を追加するか、「command ...」を追加するたびに作成ファイル、無効な文字で上記のエラーが発生します。両方のコマンドを削除すると、問題なく動作します。


1
docker-compose.yml、Dockerfile、およびデバッグしようとしているスクリプトを含めてください。
BMitch 2016

回答:


128

で起動したときにコンテナを実行し続けるdocker-composeには、次のコマンドを使用します

command: tail -F anything

したがって、docker-compose.ymlは次のようになります

version: '2'
services:
  my-test:
    image: ubuntu
    command: tail -F anything

次のコマンドを使用して、シェルを実行してコンテナに入ることができます

docker exec -i -t composename_my-test_1 bash

コンテナの先頭にcomposename付けられる名前はどこdocker-composeですか。


1
使い終わったら、どうやってコンテナを止めますか?Ctrl + C、Ctrl + Zタイプのコマンドはありますか?今、私は終了するためにターミナルを閉じる必要があります。
mac106 8818年

コンテナ内にいる場合は、入力exitしてホストマシンに戻ることができます。ホストを使用している場合は、Docker(docker stop composename_my-test_1)またはDocker Compose(docker-compose stop)を使用してコンテナーを停止できます。
Nick Settje 2018年

2
@ Alexis.Rolland新しいSOの質問をして、詳細を共有していただける場合は、ぜひご覧ください。私の推測では、Dockerやホストオペレーティングシステムの問題ではなく、エラーはコンテナの1つの内部に関係していると思います。
Nick Settje 2018

1
@ mac10688接続されたコンテナセッションにプロンプ​​トがない場合は、ctrl-dでデタッチしてみてください
Stark

7
/dev/nullanythingテールコマンド参照用に適切に配置する方がよいでしょう。stackoverflow.com/a/48732671/248616
Nam

90

tty構成オプションを使用できます。

version: '3'

services:
  app:
    image: node:8
    tty: true           # <-- This option

注:イメージとDockerfileでDockerfileを使用する場合CMD、このオプションは機能しません。ただし、Dockerfileからentrypointをクリアするcomposeファイルのオプションを使用できますCMD


9
これは機能し、よりハッキーではないようですtail -f /dev/null。これにより、postgresデータベースが接続されたコンテナ化された開発環境をdocker-compose up実行し、を使用して別のターミナルを介してシェルを実行できますdocker exec
Psiloc

1
現在、十分に文書化されていませんが。これは、同じ効果を達成する公式のオプションであるtail -f /dev/nulltail -f anything、こちらをご覧ください:docs.docker.com/compose/compose-file
B01

2
@ ABMRuman&Psiloc、docker-compose.ymlファイルで「コマンド」を使用しない場合にのみ機能します。「コマンド」を使用する場合は、別のハックが必要です。したがって、ここではテール-Fハックが最適です。
asafel

1
dockerfileでエントリポイントを使用する場合、これが最良の答えである必要があります。
DDKV5 8720年

54

2015年8月26日のGitHubでの@aanandのコメントに基づくと、dockertail -f /dev/null -composeでコンテナの実行を維持するために使用できます。

docker-compose.ymlの例

version: '3'
services:
  some-app:
    command: tail -f /dev/null

なぜこのコマンド?

このオプションを選択した唯一の理由は、GitHubで多くの賛成を得たためですが、投票数が最も多かったからといって、それが最良の回答であるとは限りません。2番目の理由は、期限のために問題をできるだけ早く解決する必要があったため、実用的な理由でした。


2
なぜこのコマンドなのか?何が他より良いのですか?私の場合だけではbashを起動すると、...同様のトリックをやった
N4ppeL

@ N4ppeL良い質問です。私がこのオプションを選択した唯一の理由は、githubで多くの賛成を得たということでしたが、投票数が最も多かったからといって、それが最良の回答であるとは限りません。2つ目の理由は、締め切りのためにできるだけ早く問題を解決しなければならなかったため、実用的な理由でした。
030

17
  • というファイルを作成します docker-compose.yml
  • 以下をファイルに追加します
version: "3"

services:
  ubuntu:
    image: ubuntu:latest
    tty: true
  • 同じディレクトリにとどまりdocker-compose up -d、ターミナルから実行します
  • 実行docker psしてコンテナIDまたは名前を取得します
  • あなたは実行することができます docker inspect $container_id
  • コンテナに入ってbashシェルを実行するdocker-compose exec ubuntu /bin/bashか、docker-compose exec ubuntu /bin/sh
  • 完了したら、コンテナの外にいることを確認して実行します docker-compose down

これmy-docker-shell.shは、docker作成ファイルを作成し、コンテナーを実行し、コンテナーにログインし、最後にログアウト時にdockerコンテナーとdocker作成ファイルをクリーンアップするための小さなbashスクリプト()です。

#!/bin/bash

cat << 'EOF' > ./docker-compose.yml
---

version: "3"

services:
  ubuntu:
    image: ubuntu:latest
    command: /bin/bash
    # tty: true

...
EOF

printf "Now entering the container...\n"
docker-compose run ubuntu bash
docker-compose down

rm -v ./docker-compose.yml

1
これは質問に対する実際の答えではありませんでしたが、非常に価値があることがわかりました。私はこのアプローチのためのグローバルbashrcに機能を使用するために、さらに行ってきました:gist.github.com/loopmode/4d59a4e9a0a2ffacaec2dd14db4ae8bd
loopmode

8

Dockerfileでは、次のコマンドを使用できます。

{CMD sleep infinity}

2

コメント提供者が述べたように、完全な答えを出すには、問題のDockerfileを確認する必要がありますが、これは非常によくある間違いです。実行しようとしているコマンドがバックグラウンドプロセスを開始していることはほぼ保証できます。これは、Docker以外の状況で実行するコマンドかもしれませんが、Dockerfileで実行するのは間違っています。たとえば、実行しているものが通常システムサービスとして定義されている場合は、「systemctlstart」のようなものを使用できます。それはバックグラウンドでプロセスを開始しますが、それは機能しません。プロセスをフォアグラウンドで実行する必要があるため、プロセス全体がブロックされます。


0

簡単なメモ

に基づいて単一の画像をテストしたgolangので、docker-compose downここで呼び出すと、次のようになります。

version: "3.1"
...
command: tail -f /dev/null   # stopping container takes about 10 sec.
tty: true                    # stopping container takes about 2 sec.

私のシステム情報:

Ubuntu 18.04.4 LTS (64-bit)
Docker version 19.03.6, build 369ce74a3c
docker-compose version 1.26.0, build d4451659

-3

さて、私は自分の間違いを見つけました。作成に使用するイメージのDockerfileで、ベースイメージをubuntu:latestにするように指定しましたが、以前にubuntuというイメージを自分で作成したため、そのイメージが機能しませんでした。そのため、元のubuntuイメージではなく、ubuntuとも呼ばれる自分のイメージの破損したバージョンを使用しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.