Docker Composeのみを使用してコンテナ内でインタラクティブシェルを起動する方法はありますか?私のdocker-compose.ymlで、こんなことを試してみました。
myapp:
image: Alpine:latest
entrypoint: /bin/sh
Docker-compose upを使ってこのコンテナを起動するとすぐに終了します。対話式シェルとして起動するためにentrypointコマンドに追加できるフラグ、またはmyappの追加オプションがありますか?
私はこれを達成するためのネイティブのdockerコマンドオプションがあることを知っています、それがDocker Composeだけを使用することも可能であるならばちょうど興味があります。
あなたのdocker-compose.ymlに以下の行を含める必要があります:
stdin_open: true
tty: true
最初のものは-i
のdocker run
に対応し、2番目は-t
に対応します。
Docker-composeを使ってインタラクティブなシェルを作るための標準的な方法は、docker-compose run --rm myapp
を使うことです。
stdin_open: true, tty: true
を設定することはできますが、ログがすべてのコンテナからストリーミングされるため、実際にはup
を使用して適切なシェルを作成することはできません。
また使用することができます
docker exec -ti <container name> /bin/bash
実行中のコンテナにシェルを取得する。
公式の入門例( 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
docker-compose run myapp sh
が取り引きをするべきです。
up
/run
とは混乱がありますが、docker-compose run
のドキュメントには素晴らしい説明があります: https://docs.docker.com/compose/reference/run
Docker-composeを使用して、これを行う最も簡単な方法は、(docker ps -a
でコンテナーを開始した後に)docker-compose up
を実行し、対話式シェルを置きたいコンテナーのIDを取得することです(xyz123と呼びます)。
それならdocker exec -ti xyz123 /bin/bash
を実行するのは簡単なことです
対話型のシェルです。
未来の誰かがここでも疑問に思うならば:
docker-compose exec container_name sh
または
docker-compose exec container_name bash
または、次のように単一行を実行することもできます。
docker-compose exec container_name php -v
それはあなたがすでにあなたのコンテナーを稼働させた後です
コマンドラインでdocker-compose exec SERVICE_NAME sh
を実行できます。 SERVICE_NAMEはdocker-compose.ymlで定義されています。例えば、
services:
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181:2181"
SERVICE_NAMEはzookeeperになります。