Solucionado (ver solução)
Solucionado
(ver solução)
13
respostas

Como executar comandos pelo docker-compose

Olá pessoal!

Estou utilizando o docker-compose para levantar as maquinas e para automatizar mais ainda gostaria de executar alguns comandos para instalar git por exemplo entre outros. Como posso fazer isso no arquivo .yml?

Valeu!

13 respostas

Fala aí Henrique, blz?

Então no arquivo docker-compose.yml você só consegue declarar quais containers devem subir e suas devidas configurações (link, volume, ports, env e etc...).

e existe algum comando/configurações para executar um bash por exemplo?

quero iniciar o apache2 por exemplo

Fala aí Henrique.

Então o que você pode fazer é com que um dos seus containers declarados no seu docker-compose.yml rode o apache.

Você criar um Dockerfile e nele declarar exatamente o que você quer que rode no container.

E depois declarar esse container no seu docker-compose.yml.

Peguei a imagem do ubuntu 16.04 e coloquei apache2, composer, git e outros... Ai fiz minha imagem porem quando rodo o "docker-compose -d up" alem dessa minha imagem não ficar "startada" na lista do "docker ps" quando dou um start na mão nela o apache nao inicializa automaticamente... Por isso dos comandos

Então mas se você subiu os containers com via docker-compose eles não são listados com docker ps e sim com docker-compose ps.

Para ter certeza se seu container subiu ou não você pode retirar a opção -d assim ele executará tudo em foreground e seu terminal ficará preso com os containers rodando.

hmmm, nao conhecia esse docker-compose ps ... boa!

O estranho é que se eu fizer um docker-compose.yml apenas com isso:

msrv1:
  image: ubuntu:16.04
  ports:
    - 80:80

em seguida rodar entao "docker-compose ps" ele ira retornar como state = Exit 0

existe algum outro parametro para deixar como start, sempre?

Nesse caso não tem como, pois você está usando a imagem oficial do ubuntu e ela tem como CMD no seu Dockerfile somente bash. Que no caso executa um comando e finaliza. Como não foi passado nenhum comando para ele. Ele simplesmente finaliza o bash e com isso seu container morre.

O que você pode fazer é criar um Dockerfile seu, que herde da imagem do ubuntu:16.04 e no seu Dockerfile fazer a instalação do apache e no CMD iniciar o apache em foreground para que o processo fique rodando. Dessa forma enquanto o processo do apache estiver rodando seu container vai ficar no ar.

Depois de criar o Dockerfile e feito o build para uma imagem, você substituir no seu docker-compose.yml de ubuntu:16.04 para o nome que você deu para sua imagem.

Assim o compose, irá subir sua imagem que tem um processo do apache rodando.

Aqui está o Dockerfile da imagem do ubuntu na versão que você está usando: https://github.com/tianon/docker-brew-ubuntu-core/blob/b6f1fe19228e5b6b7aed98dcba02f18088282f90/xenial/Dockerfile`

Muito bom Fernando Furtado! Vou tentar isso

Quanto ao link, não consegui acessar... Parece não existir esse arquivo dentro do projeto do git.

Tenta por esse: https://hub.docker.com/_/ubuntu/

Esse é o link do docker-hub para a imagem oficial do ubuntu logo ao acessar você vai ver um box Full Description e dentro desse box, você vai encontrar várias versões de imagens. E no final da linha de cada versão tem um link com o nome da versão/Dockerfile (por exemplo: xenial/Dockerfile.)

Consegui criar através do dockerfile!

Mas continuamos na mesma... Ao criar um novo container diretamente com a imagem ou seja:

docker run -it -d --name teste -p 80:80 henriqueweiand/micsrv:1.1

Ele funciona, inclusive da start no apache2. Agora quando é feito o a mesma configuração porem no docker-compose ele não mantém o container ligado, fica simplesmente como Exited.

Ao executar docker-compose logs, não aparecem nenhum erro referente a tentativa de criação do mesmo.

Este é meu dockerfile que gerou a imagem inicialmente:

FROM ubuntu:16.04
MAINTAINER Henrique Weiand <henriqueweiand@gmail.com>

RUN apt-get update && apt-get install -y apache2 git npm
RUN apt-get install -y php7.0 libapache2-mod-php7.0 php7.0-mbstring php7.0-zip php7.0-xml php7.0-mysql mysql-client php7.0-pgsql zip unzip nano curl 
RUN a2enmod rewrite

ENV COMPOSER_HOME /composer
ENV PATH /composer/vendor/bin:$PATH
ENV COMPOSER_ALLOW_SUPERUSER 1

RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"
RUN php composer.phar --install-dir=bin --filename=composer
RUN mv composer.phar /usr/local/bin/composer

EXPOSE 80

CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

Logo, meu docker-compose.yml

db1:
  image: mysql:latest
  volumes:
    - C:/Users/henrique/Desktop/microservices/database/db1:/var/lib/mysql
  environment:
    - MYSQL_ROOT_PASSWORD=root
  ports:
    - 3306:3306
msrv1:
  image: henriqueweiand/micsrv:1.1
  volumes:
    - C:/Users/henrique/Desktop/microservices/service1:/var/www/html
  links:
    - db1:db1
  ports:
    - 80:80

Quando executo "docker-compose up" (sem -d) retorna o seguinte:

PS C:\Users\henrique\Desktop\microservices> docker-compose up
Creating microservices_db1_1
Creating microservices_msrv1_1
Attaching to microservices_db1_1, microservices_msrv1_1
db1_1    | 2017-01-21T05:16:17.174977Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please us
db1_1    | 2017-01-21T05:16:17.178922Z 0 [Note] mysqld (mysqld 5.7.17) starting as process 1 ...
msrv1_1  | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.
db1_1    | 2017-01-21T05:16:17.190614Z 0 [Note] InnoDB: PUNCH HOLE support available
db1_1    | 2017-01-21T05:16:17.190683Z 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
db1_1    | 2017-01-21T05:16:17.190698Z 0 [Note] InnoDB: Uses event mutexes
db1_1    | 2017-01-21T05:16:17.190719Z 0 [Note] InnoDB: GCC builtin __atomic_thread_fence() is used for memory ba
db1_1    | 2017-01-21T05:16:17.190733Z 0 [Note] InnoDB: Compressed tables use zlib 1.2.3
db1_1    | 2017-01-21T05:16:17.190747Z 0 [Note] InnoDB: Using Linux native AIO
db1_1    | 2017-01-21T05:16:17.191095Z 0 [Note] InnoDB: Number of pools: 1
db1_1    | 2017-01-21T05:16:17.191238Z 0 [Note] InnoDB: Using CPU crc32 instructions
db1_1    | 2017-01-21T05:16:17.193809Z 0 [Note] InnoDB: Initializing buffer pool, total size = 128M, instances =
db1_1    | 2017-01-21T05:16:17.205834Z 0 [Note] InnoDB: Completed initialization of buffer pool
db1_1    | 2017-01-21T05:16:17.208644Z 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner
db1_1    | 2017-01-21T05:16:17.620131Z 0 [Note] InnoDB: Highest supported file format is Barracuda.
db1_1    | 2017-01-21T05:16:18.991202Z 0 [Note] InnoDB: Creating shared tablespace for temporary tables
db1_1    | 2017-01-21T05:16:18.991935Z 0 [Note] InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing
db1_1    | 2017-01-21T05:16:19.397730Z 0 [Note] InnoDB: File './ibtmp1' size is now 12 MB.
db1_1    | 2017-01-21T05:16:19.417276Z 0 [Note] InnoDB: 96 redo rollback segment(s) found. 96 redo rollback segme
db1_1    | 2017-01-21T05:16:19.417314Z 0 [Note] InnoDB: 32 non-redo rollback segment(s) are active.
db1_1    | 2017-01-21T05:16:19.418656Z 0 [Note] InnoDB: Waiting for purge to start
db1_1    | 2017-01-21T05:16:19.469288Z 0 [Note] InnoDB: 5.7.17 started; log sequence number 12168531
db1_1    | 2017-01-21T05:16:19.469771Z 0 [Note] Plugin 'FEDERATED' is disabled.
db1_1    | 2017-01-21T05:16:19.515129Z 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool
db1_1    | 2017-01-21T05:16:19.684762Z 0 [Warning] Failed to set up SSL because of the following SSL library erro
db1_1    | 2017-01-21T05:16:19.687168Z 0 [Note] Server hostname (bind-address): '*'; port: 3306
db1_1    | 2017-01-21T05:16:19.687723Z 0 [Note] IPv6 is available.
db1_1    | 2017-01-21T05:16:19.687958Z 0 [Note]   - '::' resolves to '::';
db1_1    | 2017-01-21T05:16:19.689228Z 0 [Note] Server socket created on IP: '::'.
db1_1    | 2017-01-21T05:16:19.777876Z 0 [Note] InnoDB: Buffer pool(s) load completed at 170121  5:16:19
db1_1    | 2017-01-21T05:16:19.956069Z 0 [Warning] 'user' entry 'root@localhost' ignored in --skip-name-resolve m
db1_1    | 2017-01-21T05:16:19.956351Z 0 [Warning] 'user' entry 'mysql.sys@localhost' ignored in --skip-name-reso
db1_1    | 2017-01-21T05:16:19.956666Z 0 [Warning] 'db' entry 'sys mysql.sys@localhost' ignored in --skip-name-re
db1_1    | 2017-01-21T05:16:19.956924Z 0 [Warning] 'proxies_priv' entry '@ root@localhost' ignored in --skip-name
db1_1    | 2017-01-21T05:16:20.105608Z 0 [Warning] 'tables_priv' entry 'sys_config mysql.sys@localhost' ignored i
db1_1    | 2017-01-21T05:16:21.643934Z 0 [Note] Event Scheduler: Loaded 0 events
db1_1    | 2017-01-21T05:16:21.644341Z 0 [Note] Executing 'SELECT * FROM INFORMATION_SCHEMA.TABLES;' to get a lis
rtition-engine-check' to skip this check.
db1_1    | 2017-01-21T05:16:21.644360Z 0 [Note] Beginning of list of non-natively partitioned tables
db1_1    | 2017-01-21T05:16:23.438469Z 0 [Note] End of list of non-natively partitioned tables
db1_1    | 2017-01-21T05:16:23.438624Z 0 [Note] mysqld: ready for connections.
db1_1    | Version: '5.7.17'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)

Depois, encerrei comctrl+c e rodei novamente o docker-composer up -d. Com isso fui ver se ambas as maquinas estavam ligadas com "docker-compose ps" e retornou:

PS C:\Users\henrique\Desktop\microservices> docker-compose ps
        Name                       Command               State
-----------------------------------------------------------------
microservices_db1_1     docker-entrypoint.sh mysqld      Up
microservices_msrv1_1   /usr/sbin/apache2ctl -D FO ...   Exit 0

Não sei qual o problema com este container que não inicia automaticamente com o comando up

:/

solução!

Então Henrique a saída do docker-compose ps diz que seu container saiu (Exit 0). Ou seja ele iniciou mas por algum motivo ele caiu.

E se você notar no log tem a seguinte mensagem para o seu container do apache: msrv1_1 | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.

Creio que seu container não está conseguindo se conectar ao banco ou à algum outro recurso.

Espero ter ajudado.