Como mencionado em docker-compose run
(2015)
O comando transmitido pela execução substitui o comando definido na configuração do serviço .
Por exemplo, se a configuração do serviço da web for iniciada bash
, docker-compose run web python app.py
substitua-a por python app.py
.
A segunda diferença é que o docker-compose run
comando não cria nenhuma das portas especificadas na configuração do serviço .
Isso evita colisões de portas com portas já abertas. Se você deseja que as portas do serviço sejam criadas e mapeadas para o host, especifique o sinalizador --service-ports:
$ docker-compose run --service-ports web python manage.py shell
Portanto, a menos que você tenha essas necessidades específicas (substituir um comando ou executar apenas um contêiner em portas diferentes), docker-compose up
(mesmo para um contêiner) é suficiente.
Você pode ajudar a explicar por que ou quando você não deseja que as portas sejam criadas? É por isso que ou quando eles podem entrar em conflito com portas já abertas
Simplesmente porque docker-compose run
é feito para executar comandos únicos para seus serviços.
Isso significa que, se você já fez um docker-compose up
, todos os seus contêineres já estão sendo executados nas portas especificadas docker-compose.yml
.
Fazer um docker-compose run
nesse estágio (para executar um comando único), se estiver respeitando a mesma porta, falhará imediatamente. Daí a não criação padrão dessas portas.
Outro caso de uso (na referência de variáveis de ambiente Compose ):
Para ver quais variáveis de ambiente estão disponíveis para um serviço, execute docker-compose run SERVICE env
.
A versão mais recente (2019+) desses comandos está em docker/docker.github.io
:
docker-compose run
para executar comandos em um serviço em execução edocker-compose up
gerar um novo serviço.