Eu quero fazer algo assim, onde eu possa executar vários comandos em ordem.
db:
image: postgres
web:
build: .
command: python manage.py migrate
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
links:
- db
docker
yaml
docker-compose
RustyShackleford
fonte
fonte
/bin/bash
sh
:[sh, -c, "cd /usr/src/app && npm start"]
ash
em alpino :)Eu corro coisas pré-inicialização, como migrações em um contêiner efêmero separado, assim (observe, o arquivo de composição deve ser do tipo versão 2):
Isso ajuda as coisas a se manterem limpas e separadas. Duas coisas a considerar:
Você precisa garantir a sequência de inicialização correta (usando o Depend_on)
você deseja evitar várias compilações, o que é conseguido marcando-a na primeira vez usando compilação e imagem; você pode consultar a imagem em outros recipientes
fonte
bash -c
acima.Eu recomendo usar
sh
o contrário,bash
porque está mais prontamente disponível na maioria das imagens baseadas em unix (alpino, etc.).Aqui está um exemplo
docker-compose.yml
:Isso chamará os seguintes comandos em ordem:
python manage.py wait_for_db
- aguarde o db estar prontopython manage.py migrate
- execute qualquer migraçãopython manage.py runserver 0.0.0.0:8000
- iniciar meu servidor de desenvolvimentofonte
>
é utilizado para iniciar uma entrada multi-linha (ver stackoverflow.com/a/3790497/2220370 )Isso funciona para mim:
docker-compose tenta desreferenciar variáveis antes de executar o comando, portanto, se você deseja que o bash manipule variáveis, precisará escapar dos cifrões dobrando-os ...
... caso contrário, você receberá um erro:
fonte
$${Types}
e$${Client}
. Eu acho que isso impedirá que o docker compose interprete essas variáveis e procure seus valores em qualquer shell do qual você invoque o docker-composit, o que significa que eles ainda estão por aí para que o bash os desreferencie ( depois que o docker processou seu.env
arquivo).Você pode usar o ponto de entrada aqui. O ponto de entrada na janela de encaixe é executado antes do comando while command é o comando padrão que deve ser executado quando o contêiner é iniciado. Portanto, a maioria dos aplicativos geralmente realiza o procedimento de instalação no arquivo de ponto de entrada e, no último, eles permitem a execução do comando.
make um arquivo de script de shell pode ser o seguinte
docker-entrypoint.sh
(o nome não importa) com o seguinte conteúdo.no arquivo docker-compose.yml, use-o com
entrypoint: /docker-entrypoint.sh
e o comando register comocommand: python manage.py runserver 0.0.0.0:8000
PS: não esqueça de copiardocker-entrypoint.sh
junto com o seu código.fonte
docker-compose run service-name ....
Outra ideia:
Se, como neste caso, você criar o contêiner, basta colocar um script de inicialização nele e executá-lo com o comando Ou monte o script de inicialização como volume.
fonte
#!/bin/bash \n python manage.py migrate \n python manage.py runserver 0.0.0.0:8000
(oneline feio)* ATUALIZAÇÃO *
Achei que a melhor maneira de executar alguns comandos é escrever um Dockerfile personalizado que faça tudo o que eu quero antes que o CMD oficial seja executado a partir da imagem.
docker-compose.yaml:
Dockerfile.mongo:
Esta é provavelmente a maneira mais limpa de fazer isso.
* À MODA ANTIGA *
Eu criei um script de shell com meus comandos. Nesse caso, eu queria começar
mongod
e executar,mongoimport
mas chamar omongod
impede de executar o resto.docker-compose.yaml :
start_mongod.sh :
Então, esse garfo mongo, monitora a importação e, em seguida, mata o mongo bifurcado que é desanexado e o inicia novamente sem desconectar. Não tenho certeza se existe uma maneira de conectar-se a um processo bifurcado, mas isso funciona.
NOTA: Se você deseja carregar estritamente alguns dados db iniciais, é assim que se faz:
mongo_import.sh
Os arquivos mongo_fixtures / *. json foram criados por meio do comando mongoexport.
docker-compose.yaml
fonte
Se você precisar executar mais de um processo de daemon, há uma sugestão na documentação do Docker para usar o Supervisord em um modo desanexado, para que todos os sub-daemons sejam exibidos no stdout.
De outra pergunta do SO, descobri que você pode redirecionar a saída dos processos filho para o stdout. Dessa forma, você pode ver toda a saída!
fonte
Para executar vários comandos no arquivo docker-compose usando
bash -c
.Fonte: https://intellipaat.com/community/19590/docker-run-multiple-commands-using-docker-compose-at-once?show=19597#a19597
fonte
Use uma ferramenta como espera por ele ou dockerize . Esses são pequenos scripts de wrapper que você pode incluir na imagem do seu aplicativo. Ou escreva seu próprio script de wrapper para executar comandos mais específicos do aplicativo. de acordo com: https://docs.docker.com/compose/startup-order/
fonte
Eu me deparei com isso enquanto tentava configurar meu contêiner jenkins para criar contêineres docker como o usuário jenkins.
Eu precisava tocar no arquivo docker.sock no Dockerfile, como eu o vinculo mais tarde no arquivo docker-compose. A menos que eu toquei primeiro, ele ainda não existia. Isso funcionou para mim.
Dockerfile:
docker-compose.yml:
fonte
tente usar ";" para separar os comandos se você estiver na versão dois, por exemplo
command: "sleep 20; echo 'a'"
fonte