docker-compor para apenas determinados contêineres


161

Eu tenho um docker-compose.ymlque contém vários recipientes. Três deles são para o meu aplicativo (cliente, servidor e banco de dados) e o restante é para várias ferramentas de desenvolvimento (por exemplo, psql, npm, manage.py, etc). Quando eu faço, docker-compose uptodos eles são iniciados, mas eu quero apenas os três principais. Por causa dos links que especifiquei, posso iniciar apenas esses três, docker-compose up clientmas a saída é somente desse contêiner. Portanto, existe uma maneira de fazer o seguinte:

  1. Diga ao docker-componha quais contêineres devem ser iniciados por docker-compose up
  2. Obtenha a saída de todos os contêineres vinculados em docker-compose up client

1
De acordo com a documentação: docker-compose up [options] [SERVICE...]permite iniciar qualquer subconjunto de serviços que você deseja listar.
Jesse Chisholm

Respostas:


257

Você pode iniciar contêineres usando:

$ docker-compose up -d client

Isso executará contêineres em segundo plano e a saída estará disponível a partir de

$ docker-compose logs

e consistirá em todos os seus contêineres iniciados


11
Perfeito. Basta soltar o sinalizador -d se você quiser ver os logs ecoou para stdout
Natus tirei

É possível iniciar um contêiner dependente, se o contêiner de dependência já estiver em execução e eu não desejar reiniciá-lo?
majTheHero

43

Para iniciar um serviço específico definido no seu arquivo docker-compose. por exemplo, se você tiver um docker-compose.yml

sudo docker-compose start db  

dado um arquivo de composição como:

version: '3.3'

services:
   db:
     image: mysql:5.7
     ports:
       - "3306:3306"
     volumes:
       - ./db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: yourPassword
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: yourPassword

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "80:80"
     volumes:
       - ./l3html:/var/www/html
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: yourPassword
volumes:
    db_data:
    l3html:

Algumas vezes você deseja iniciar apenas o mySQL (às vezes, apenas deseja preencher um banco de dados) antes de iniciar todo o seu conjunto.


9
Por que o sudoantes docker-compose ...? Isso não é necessário, certo?
Jochem Schulenklopper 10/01/19

1
se você não tiver um usuário no grupo de janelas de encaixe, sim, seria necessário.
Delpo

qual a diferença se eu usar em sudo docker-compose up db vez desudo docker-compose start db
Luk Aron

3
@LukAron - startassume que o contêiner já existe e apenas o inicia, extrairá upimagens, se necessário, criará contêineres, se necessário, e então iniciará o contêiner.
Jesse Chisholm

10

Ah, apenas com isso:

$ docker-compose up client server database

4

Uma boa solução é executar apenas os serviços desejados como este:

docker-compose up --build $(<services.txt)

e o arquivo services.txt ficam assim:

services1 services2, etc

é claro que, se a dependência (depend_on), precisar executar serviços relacionados juntos.

--build é opcional, apenas por exemplo.


0

Desde a docker-composev1.5 , é possível passar vários docker-compose.ymlarquivos com o -fsinalizador . Isso permite que você divida suas ferramentas de desenvolvimento em um separado, docker-compose.ymlque você inclui apenas sob demanda:

# start and attach to all your essential services
docker-compose up

# execute a defined command in docker-compose.dev.yml
docker-compose -f docker-compose.dev.yml run npm update

# if your command depends_on a service you need to include both configs
docker-compose -f docker-compose.yml -f docker-compose.dev.yml run npm update

Para uma discussão aprofundada sobre isso, consulte docker / componen # 1896 .

Eu criei uma solicitação pull para adicionar uma funcionalidade para conseguir isso com muito mais conveniência ( janela de encaixe / composição # 7548 ), mas como isso requer uma alteração nas especificações do arquivo de composição, isso agora é discutido em compose-spec / compose-spec # 87 .


-1

Você geralmente não quer fazer isso. Com o Docker Compose, você define os serviços que compõem seu aplicativo. npme manage.pysão apenas comandos de gerenciamento. Você não precisa de um contêiner para eles. Se você precisar, por exemplo, criar suas tabelas de banco de dados manage.py, tudo o que você precisa fazer é:

docker-compose run client python manage.py create_db

Pense nisso como os dynos únicos que Heroku usa.

Se você realmente precisar tratar esses comandos de gerenciamento como contêineres separados (e também usar o Docker Compose para estes), poderá criar um .ymlarquivo separado e iniciar o Docker Compose com o seguinte comando:

docker-compose up -f my_custom_docker_compose.yml

15
Muitas pessoas querem fazer isso.
kojiro

8
@ msrd0 Você geralmente não quer fazer isso? Deixe as pessoas decidirem por si mesmas!
Kris

1
Deve haver uma regra no SO que você não pode reduzir o voto sem explicar o porquê. Como isso (ou pelo menos a primeira parte) faz mais sentido, ter um contêiner adicional para cada comando de gerenciamento possível é super estranho.
thclark
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.