web-dev-qa-db-ja.com

Docker Composeを使ったインタフェイスシェル

Docker Composeのみを使用してコンテナ内でインタラクティブシェルを起動する方法はありますか?私のdocker-compose.ymlで、こんなことを試してみました。

myapp:
  image: Alpine:latest
  entrypoint: /bin/sh

Docker-compose upを使ってこのコンテナを起動するとすぐに終了します。対話式シェルとして起動するためにentrypointコマンドに追加できるフラグ、またはmyappの追加オプションがありますか?

私はこれを達成するためのネイティブのdockerコマンドオプションがあることを知っています、それがDocker Composeだけを使用することも可能であるならばちょうど興味があります。

163
drubb

あなたのdocker-compose.ymlに以下の行を含める必要があります:

stdin_open: true
tty: true

最初のものは-idocker runに対応し、2番目は-tに対応します。

219
leon.valencia

Docker-composeを使ってインタラクティブなシェルを作るための標準的な方法は、docker-compose run --rm myappを使うことです。

stdin_open: true, tty: trueを設定することはできますが、ログがすべてのコンテナからストリーミングされるため、実際にはupを使用して適切なシェルを作成することはできません。

また使用することができます

docker exec -ti <container name> /bin/bash

実行中のコンテナにシェルを取得する。

141
dnephin

公式の入門例( https://docs.docker.com/compose/gettingstarted/ )では、次のdocker-compose.ymlが含まれています。

version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis:Alpine"

docker-compose upでこれを始めた後、あなたは簡単にあなたのredisコンテナかあなたのwebコンテナのどちらかにシェルで入れることができます:

docker-compose exec redis sh
docker-compose exec web sh 
33
clay

docker-compose run myapp shが取り引きをするべきです。

up/runとは混乱がありますが、docker-compose runのドキュメントには素晴らしい説明があります: https://docs.docker.com/compose/reference/run

23
Alex Povar

Docker-composeを使用して、これを行う最も簡単な方法は、(docker ps -aでコンテナーを開始した後に)docker-compose upを実行し、対話式シェルを置きたいコンテナーのIDを取得することです(xyz123と呼びます)。

それならdocker exec -ti xyz123 /bin/bashを実行するのは簡単なことです

対話型のシェルです。

21
David Hersey

未来の誰かがここでも疑問に思うならば:

docker-compose exec container_name sh

または

docker-compose exec container_name bash

または、次のように単一行を実行することもできます。

docker-compose exec container_name php -v

それはあなたがすでにあなたのコンテナーを稼働させた後です

6

コマンドラインでdocker-compose exec SERVICE_NAME shを実行できます。 SERVICE_NAMEはdocker-compose.ymlで定義されています。例えば、

services:
    zookeeper:
        image: wurstmeister/zookeeper
        ports:
          - "2181:2181"

SERVICE_NAMEはzookeeperになります。

1
Yu N.