Devo usar a janela de encaixe para compor ou executar?

129

Existe um motivo para runiniciar um docker-compose.ymlarquivo ou você deve apenas usá-lo up?

Entendo que runpode iniciar um contêiner específico, mas estou me referindo ao caso em que você o usa sem especificar um contêiner para que ele inicie todos os seus contêineres yml.

Raif
fonte

Respostas:

141

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.pysubstitua-a por python 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:

VonC
fonte
27

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
quickinsights
fonte
7

Há uma resposta dos documentos do docker .

Normalmente, você quer docker-compose up. Use uppara iniciar ou reiniciar todos os serviços definidos em a docker-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. Use run para executar testes ou executar uma tarefa administrativa, como remover ou adicionar dados a um contêiner de volume de dados. O runcomando atua como docker 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.

Jay
fonte
1
Essa deve ser a resposta aceita. Basicamente, use docker-compose runpara executar comandos em um serviço em execução e docker-compose upgerar um novo serviço.
goonerify