Respostas:
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 iniciadabash
,docker-compose run web python app.py
substitua-a porpython 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
:
Gostaria de salientar que se você estiver usando Python com o depurador pdb:
import pdb; pdb.set_trace()
Ele não cairá no shell se você executar seu script usando:
docker-compose up
No entanto, se você usar run, ele será exibido no depurador conforme o esperado:
docker-compose run
Há uma resposta dos documentos do docker .
Normalmente, você quer
docker-compose up
. Useup
para iniciar ou reiniciar todos os serviços definidos em adocker-compose.yml
. No modo "anexado" padrão, você vê todos os logs de todos os contêineres. No modo "desanexado" (-d
), o Compose sai após o início dos contêineres, mas os contêineres continuam sendo executados em segundo plano.O
docker-compose run
comando é para executar tarefas "pontuais" ou "adhoc". Requer o nome do serviço que você deseja executar e inicia apenas contêineres para serviços dos quais o serviço em execução depende. Userun
para executar testes ou executar uma tarefa administrativa, como remover ou adicionar dados a um contêiner de volume de dados. Orun
comando atua comodocker run -ti
na medida em que abre um terminal interativo para o contêiner e retorna um status de saída correspondente ao status de saída do processo no contêiner.
docker-compose run
para executar comandos em um serviço em execução edocker-compose up
gerar um novo serviço.