Interactive shell using Docker Compose
Is there any way to start an interactive shell in a container using Docker Compose only? I've tried something like this, in my docker-compose.yml:
myapp:
image: alpine:latest
entrypoint: /bin/sh
When I start this container using docker-compose up it's exited immediately. Are there any flags I can add to the entrypoint
command, or as an additional option to myapp
, to start an interactive shell?
I know there are native docker command options to achieve this, just curious if it's possible using only Docker Compose, too.
Solution 1:
You need to include the following lines in your docker-compose.yml:
version: "3"
services:
app:
image: app:1.2.3
stdin_open: true # docker run -i
tty: true # docker run -t
The first corresponds to -i
in docker run
and the second to -t
.
Solution 2:
The canonical way to get an interactive shell with docker-compose is to use:
docker-compose run --rm myapp
(With the service name myapp
taken from your example. More general: it must be an existing service name in your docker-compose file, myapp
is not just a command of your choice. Example: bash
instead of myapp
would not work here.)
You can set stdin_open: true, tty: true
, however that won't actually give you a proper shell with up
, because logs are being streamed from all the containers.
You can also use
docker exec -ti <container name> /bin/bash
to get a shell on a running container.
Solution 3:
In the official getting started example (https://docs.docker.com/compose/gettingstarted/) with the following docker-compose.yml
:
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
After you start this with docker-compose up
, you can easily shell into either your redis
container or your web
container with:
docker-compose exec redis sh
docker-compose exec web sh
Solution 4:
docker-compose run myapp sh
should do the deal.
There is some confusion with up
/run
, but docker-compose run
docs have great explanation: https://docs.docker.com/compose/reference/run