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!

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora
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.