Docker Composeを使用したインタラクティブシェル


271

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

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

docker-compose upを使用してこのコンテナーを起動すると、すぐに終了します。インタラクティブシェルとして起動するために、entrypointコマンドに追加できるフラグ、またはmyappへの追加オプションはありますか?

これを実現するためのネイティブのdockerコマンドオプションがあることは知っていますが、Docker Composeだけを使用することも可能かどうか知りたいだけです。


これは動作するはずではありません。たとえば/bin/sh、作成ファイルにエントリポイントがある複数の画像がある場合、どうすればよいですか?
Xiongbing Jin 2016

2
うーん、なぜ複数のシェルを起動しないのですか?たとえば、mysqlコンテナーにシェルを入れてmysql cliを操作し、バックアップコンテナーにシェルを入れてバックアップコマンドを実行しますか?
2016年

1
どうdocker-compose run myappですか?
ivoba

1
@ibova問題はdocker-compose run myapp、ポートを公開しないことです。したがって、使用する必要がありますdocker-compose run --service-ports myappが、それでもあまり便利ではありません。
Fool

entrypoint: /bin/shあるべきentrypoint: "/bin/sh"
codentary

回答:


342

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

version: "3"
services:
  app:
    image: app:1.2.3
    stdin_open: true # docker run -i
    tty: true        # docker run -t

最初は-iin docker runに、2番目はに対応し-tます。


3
これstdin_openはミッシングリンクです。すでにシェルを実行しているコンテナの1つに接続したときに期待される動作を提供するだけです。
Charney Kaye 2016

9
@TheFool、私でも同じ問題が発生しました。走るのが良いdocker-compose run <service_name>
Aswath K

4
これは正確にどこに追加されますか?サービス内?
problemofficer

これはOPの質問に対する最良の回答のようです。問題はコンテナーがすぐに終了することであり、そうでない場合はシェルを使用docker execしても機能しないためです。
RoyM

:これは私のWindows上でエラー与えますcolorama\win32.py, line 152, in SetConsoleTitle: ctypes.ArgumentError: ‘ValueError’: embedded null character
cowlinator

210

docker-composeでインタラクティブなシェルを取得する標準的な方法は、次のようにすることです。 docker-compose run --rm myapp

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

あなたも使うことができます

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

実行中のコンテナでシェルを取得します。


16
--service-portsポート(つまりWebサーバー用)を公開する場合は追加する必要があることに注意してください
epelc

9
回答を更新して詳細情報を提供--rmし、コンテナーを削除できるようにフラグを追加しました。@ lynx0123の答えは正しくありません。を実行しても、対話型シェルは取得されませんdocker-compose up
ドネフィン2016

2
Docker for Windowsを使用してこれを機能させるには、docker-compose v。1.9.0が必要でした(Githubの問題PRを参照)。2016年12月19日の時点で、これはDocker for Windowsのベータバージョンでのみ出荷されます。その後、docker-compose run動作します。command: /bin/bashdocker-compose.yml に追加することもできます。
Joseph238-2016

5
これが一番の答えです。これは私がここに来たときに探していたものです。
mkasberg 2017年

8
docker-compose up -d && docker attach <container_name>
アーロンマクミリン2017

58

公式の開始例(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 

44

docker-compose run myapp sh 取引を行う必要があります。

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


1
どうもありがとうございます。明確にするために少しだけ追加します。docker-compose run [your-service-name-defined-in-docker-compose.yml] [sh or bash]。
theeranitp

23

docker-composeを使用してこれを行う最も簡単な方法は、docker ps -a(コンテナーをで開始した後docker-compose up)を実行し、インタラクティブシェルを配置するコンテナーのIDを取得することです(xyz123と呼びましょう)。

次に、実行するのは簡単です docker exec -ti xyz123 /bin/bash

出来上がり、インタラクティブなシェルです。


1
なぜこれが反対票だったのかわからない-これは何か問題が発生した場合にデバッグを行うための素晴らしい方法であり、私はこの方法を使用して、このソリューションを読んでから1分以内に成功しました。
ericmjl 2017

4
@ericmjlそれは質問がドッキングウィンドウ・コンの機能を使用する方法について、具体的尋ねると、すでに他の回答で述べた2段階のプロセスだからです
OneCricketeer

19

将来の誰かもここをさまよっている場合:

docker-compose exec container_name sh

または

docker-compose exec container_name bash

または、次のような単一行を実行できます

docker-compose exec container_name php -v

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


2

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

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

SERVICE_NAME「飼育係」になります。


2

この質問は私にとって非常に興味深いものです。実行がすぐに終了し、-itで修正した後にコンテナーを実行すると問題が発生するためです。

docker run -it -p 3000:3000 -v /app/node_modules -v $(pwd):/app <your_container_id>

そして、私がdocker composeでそれを自動化しなければならないとき:

version: '3'
services:
    frontend:
        stdin_open: true
        tty: true
        build: 
            context: .
            dockerfile: Dockerfile.dev
        ports: 
            - "3000:3000"
        volumes: 
            - /app/node_modules
            - .:/app

これはトリックを作ります:stdin_open:true、tty:true

これはcreate-react-appで生成されたプロジェクトです

Dockerfile.devこれは次のようになります。

FROM node:alpine

WORKDIR '/app'

COPY package.json .
RUN npm install

COPY . . 

CMD ["npm", "run", "start"]

この例が他の人がフロントエンド(例では反応)をDockerコンテナに実行するのを助けることを願っています。


0

ymlが呼び出された場合はdocker-compose.yml、シンプルで起動できます$ docker-compose up。端末の対応するアタッチメントは簡単にできます(がとyml呼ばれるサービスを指定していることを考慮してくださいmyservice):

$ docker-compose exec myservice sh

ただし、ymlなどの別のファイル名を使用している場合は、を使用してdocker-compose-mycompose.yml起動する必要があります$ docker-compose -f docker-compose-mycompose.yml up。インタラクティブ端末を接続するにはyml、次のようにファイルも指定する必要があります。

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