Desde que reparei que a aplicação que preparámos se expandiu significativamente, decidi encontrar um método completamente novo para automatizar o processo do seu lançamento. Era importante para mim encontrar uma solução que permitisse ativar novas funcionalidades de forma isolada.
Introdução
A descoberta de um método mais simples de automatização de processos constituiria uma melhoria significativa do meu trabalho e do trabalho de toda a minha equipa. equipa. Pensei: "Porque não usar Docker?"
Durante a fase de preparação, criei duas configurações: uma para a aplicação front-end e outra para a API. Abaixo pode ver uma apresentação do que aprendi durante a processo de desenvolvimento.
O primeiro problema
Quero ter um repositório clonado no contentor, por isso adicionei uma chave ssh através do comando ADD no Dockerfile:
ADICIONAR ~/.ssh/testowy
E bam! O ficheiro não foi encontrado. Porquê?
Vamos supor que temos a seguinte estrutura de pastas:
docker/
|-- stuff/
| |-- test.txt
|-- Dockerfile
servidor/
|-- dados
| |-- setup.yml
Executar comando construir no fila de login e só pode adicionar ficheiros da pasta local e das suas subpastas locais, por exemplo, coisas.
Se pretender adicionar o servidor receberá uma mensagem: "incapaz de preparar o contexto"
Dockerignore
Já se perguntou porque é que a imagem demora tanto tempo a ser criada? Talvez não tenha utilizado .dockerignorepara ignorar os ficheiros que não são necessários na imagem. O .git deve ser removida automaticamente, bem como quaisquer ficheiros temporários.
Ordem dos comandos no Dockerfile
O Docker guarda cada linha do Dockerfile e, após a construção, cada linha é guardada como uma camada. É muito importante não alterar a ordem de determinados comandos com muita frequência.
DO ubuntu
EXECUTAR apt-get install -y software-properties-common pitão
EXECUTAR add-apt-repository ppa:chris-lea/node.js
EXECUTAR echo "deb http://us.archive.ubuntu.com/ubuntu/ precise universo" >> /etc/apt/sources.list
EXECUTAR apt-get update
EXECUTAR apt-get install -y nodejs
EXECUTAR apt-get install -y nodejs=0.6.12~dfsg1-1ubuntu1
EXECUTAR mkdir /var/www
ADICIONAR app.js /var/www/app.js
CMD ["/usr/bin/node", "/var/www/app.js"]
Por exemplo, se alterar a última linha no Dockerfile, todas as linhas anteriores serão descarregadas da cache enquanto a última linha será modificada. Quando substituir a linha nº 4, todas as linhas a partir da linha 4 até ao fim serão modificadas. Por este motivo, vale a pena colocar os comandos que não serão alterados no início do ficheiro.
Copiar ficheiros para a imagem
Vale a pena considerar para que é que uma determinada imagem será utilizada. Se precisar dela para lançar um serviço uma vez, basta copiar o código conteúdo diretamente para a imagem:
COPY . /workdir
Infelizmente, isto impossibilita a edição de ficheiros e, sempre que quiser editar o seu código, terá de construir a imagem novamente.
Se estiver a utilizar o MacOS e quiser utilizar a imagem construída para desenvolvimento, terá de abordar esta questão de uma forma ligeiramente diferente. Se utilizar volumes, tem de estar preparado para o facto de esta ser uma solução extremamente lenta (por exemplo, a cópia de um ficheiro do anfitrião para o contentor é feita a uma velocidade de 4,5 MB/s, enquanto a cópia interna no contentor é feita a uma velocidade 10-20x superior). Felizmente, como pode ver em ligaçãoO problema é conhecido e a sua solução é a questão-chave para a equipa responsável pelo desenvolvimento do Docker para Mac.
Como é que se pode utilizar o Docker para o desenvolvimento nesta situação?
Pode utilizá-lo para serviços externos, por exemplo, Redis/PSQL/Elasticsearch ou utilizar soluções prontas, que oferecem rsync: https://github.com/brikis98/docker-osx-dev
Em suma
Se tiver uma grande equipa e quiser testar uma nova funcionalidade, o docker será a ferramenta ideal! No entanto, será que a utilizaria para o lançamento de um servidor em produção? Ainda não estou totalmente convencido...
Para além disso, recomendo alguns artigos de destaque: