Acho que você tem a relação de docker e docker-compose errado:
docker-compose é um wrapper em torno de docker . Para fazer seu trabalho docker-compose precisa de sua configuração: docker-compose.yaml
Girando ainda mais o seu exemplo:
crie docker-compose.yaml :
version: '2'
services:
web:
container_name: myapp
build: .
command: node app.js
ports:
- "9000:3000"
use docker-compose para iniciar o contêiner e executar um comando no contêiner em execução:
docker-compose up
docker-compose exec web /bin/bash
docker-compose usa o nome do serviço - no seu caso, isso é web - enquanto docker usa o nome do contêiner - nesse caso, myapp .
Portanto, para executar /bin/bash a docker , você usaria o seguinte:
docker exec -ti myapp /bin/bash
você poderia remover o container_name de docker-compose.yaml , então o contêiner seria nomeado automaticamente por docker-compose - semelhante ao serviço, mas prefixado com o nome da pilha docker-compose (o nome da pasta onde docker-compose.yaml está localizado).