Update
Starting with docker-compose 1.28.0 the new service profiles are just made for that! With profiles you can mark services to be only started in specific profiles:
services:
nginx:
# ...
mysql:
# ...
composer:
profiles: ["cli-only"]
# ...
# ...
npm:
profiles: ["cli-only"]
# ...
docker-compose up # start main services, no composer and no npm
docker-compose run --rm composer
docker-compose run --rm npm
original answer
Unfortunately there is currently no convenient way to do this. The officially recommended way to do it is to separate your commands into its own docker-compose.yml:
# start all your services
docker-compose up
# execute a defined command in docker-compose.cli.yml
docker-compose -f docker-compose.cli.yml run npm update
# if your command depends_on a service you need to merge the configs
docker-compose -f docker-compose.yml -f docker-compose.cli.yml run npm update
Specifying multiple docker-compose.yml files with the -f flag will merge them together, see the documentation. This allows you to depend on services/networks/volumes which are defined in another file.
For an in-depth discussion on the whole issue see docker/compose#1896.
npmcontainer? You can alsodocker-compose runcommands based on your existing services, which might let you take these utility blocks out of your Compose setup.