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.pysubstitua-a porpython app.py.A segunda diferença é que o
docker-compose runcomando 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 runnesse 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. Useuppara 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 runcomando é 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. Userunpara executar testes ou executar uma tarefa administrativa, como remover ou adicionar dados a um contêiner de volume de dados. Oruncomando atua comodocker run -tina 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 runpara executar comandos em um serviço em execução edocker-compose upgerar um novo serviço.