
Quando aprendi a dirigir, na primeira lição, o instrutor voltou ao cruzamento e disse que você não deveria fazê-lo - nunca. Lembrei-me dessa regra imediatamente e por toda a vida.
Você lê o “Mau Conselho” para crianças de Grigory Oster e vê como é fácil e natural que elas não possam ser feitas.
Muitos artigos foram escritos sobre como escrever o Dockerfile corretamente. Mas não encontrei instruções sobre como escrever o Dockerfile errado. Eu preencho essa lacuna. E talvez nos projetos que recebo suporte, haverá menos desses arquivos de encaixe.
Todos os heróis, situações e arquivos docker são fictícios. Se você se reconhece, desculpe.
Crie um Dockerfile, Agourento e Terrível
Peter (desenvolvedor sênior de java / ruby / php): Colega Vasily, você já carregou um novo módulo no Docker?
Basil (junior): Não, não entendi com este Docker. Tantos artigos sobre ele, meus olhos se arregalam.
Peter: Temos um prazo de um ano atrás. Vamos ajudar, vamos descobrir isso no processo. Diga-me o que você não pode fazer lá.
Basil: Não posso escolher a imagem básica para que ela seja mínima, mas havia tudo o que era necessário.
Peter: Pegue a imagem do ubuntu, ele tem tudo que você precisa. E que excesso de excesso, será útil. E não se esqueça de colocar a tag mais recente para que a versão seja sempre a mais recente.
E no Dockerfile, a primeira linha aparece:
FROM ubuntu:latest
Peter: Qual é o próximo passo, sobre o que escrevemos nosso módulo?
Basil: Então, ruby, deve haver um servidor da Web e alguns daemons de serviço.
Peter: Sim, do que precisamos: ruby, bundler, nodejs, imagemagick e o que mais ... E ao mesmo tempo, atualize para obter novos pacotes com certeza.
Basil: E não criaremos o usuário, para não ser root?
Peter: Oh, bem, então ainda brinque com os direitos.
Vasily: Eu preciso de tempo, cerca de 15 minutos, para fazer tudo em uma equipe, eu li isso ...
(Peter interrompe rudemente o junho meticuloso e muito inteligente.)
Peter: Escreva em equipes separadas, e será mais fácil ler.
O Dockerfile está crescendo:
FROM ubuntu:latest RUN apt-get update RUN apt-get upgrade RUN apt-get -y install libpq-dev imagemagick gsfonts ruby-full RUN gem install bundler RUN curl -sL https://deb.nodesource.com/setup_9.x | sudo bash - RUN apt-get install -y nodejs RUN bundle install --without development test --path vendor/bundle RUN rm -rf /usr/local/bundle/cache/*.gem RUN apt-get clean RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
Então Igor Ivanovich entrou no escritório, DevOps (mas mais Ops que Dev), gritando:
AI: Petya, seus desenvolvedores novamente quebraram o banco de dados prod, quando termina ....
Depois de um pequeno conflito, Igor Ivanovich esfria e começa a descobrir o que seus colegas estão fazendo aqui.
AI: O que você está fazendo?
Basil: Peter me ajuda a compilar um Dockerfile para um novo módulo.
II: Vamos dar uma olhada ... O que você escreveu aqui, você limpa o repositório com um comando separado, esta é uma camada adicional ... Mas como você coloca as dependências se não copiou o Gemfile! E de qualquer maneira, isso não é bom.
Peter: Por favor, cuide dos seus negócios, vamos descobrir de alguma forma.
Igor Ivanovich suspira tristemente e sai para descobrir quem quebrou o banco de dados.
Peter: Sim, mas sobre o código, ele disse a coisa certa, você precisa colocá-lo na imagem. E vamos colocar o ssh e o supervisor imediatamente, caso contrário, iniciaremos os daemons.
Vasily: Então eu primeiro copio Gemfile e Gemfile.lock, depois coloco tudo e copio todo o projeto. Se o Gemfile não mudar, a camada será retirada do cache.
Peter: O que vocês são com essas camadas, copie tudo de uma vez. Copie imediatamente. A primeira linha
O Dockerfile agora fica assim:
FROM ubuntu:latest COPY ./ /app WORKDIR /app RUN apt-get update RUN apt-get upgrade RUN apt-get -y install libpq-dev imagemagick gsfonts ruby-full ssh supervisor RUN gem install bundler RUN curl -sL https://deb.nodesource.com/setup_9.x | sudo bash - RUN apt-get install -y nodejs RUN bundle install --without development test --path vendor/bundle RUN rm -rf /usr/local/bundle/cache/*.gem RUN apt-get clean RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
Peter: Então, o que vem a seguir. Você tem configurações para supervisor?
Manjericão: Nah, não. Mas farei isso rapidamente.
Pedro: Então faça. Vamos agora esboçar o script init que executará tudo. Então, com isso, você inicia o ssh com nohup para que possamos nos conectar ao contêiner e ver o que deu errado. Em seguida, inicie também o supervisor. Bem, então apenas corra passageiros.
P: Mas eu li que deveria haver um processo, portanto o Docker saberá que algo deu errado e pode reiniciar o contêiner.
P: Não se incomode com sua cabeça. E, em geral, como? Como você executa tudo em um processo? Que Igor Ivanovich pense em estabilidade, não é por acaso que ele recebe um salário. Nosso negócio é escrever código. De qualquer forma, deixe-o dizer obrigado por escrever o Dockefile para ele.
Após 10 minutos e dois vídeos sobre gatos.
Q: eu fiz tudo. Eu também adicionei comentários.
P: Mostrar!
Nova versão do Dockerfile:
FROM ubuntu:latest # COPY ./ /app WORKDIR /app # RUN apt-get update # RUN apt-get upgrade # RUN apt-get -y install libpq-dev imagemagick gsfonts ruby-full ssh supervisor # bundler RUN gem install bundler # nodejs RUN curl -sL https://deb.nodesource.com/setup_9.x | sudo bash - RUN apt-get install -y nodejs # RUN bundle install --without development test --path vendor/bundle # RUN rm -rf /usr/local/bundle/cache/*.gem RUN apt-get clean RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* # , , . CMD [“/app/init.sh”]
P: Ótimo, eu gosto. E os comentários em russo são convenientes e legíveis, todos trabalhariam assim. Eu te ensinei tudo, então você pode fazer isso sozinho. Vamos tomar café ...
Bem, aqui temos um Dockerfile absolutamente terrível, da visão de que Igor Ivanovich quer sair e seus olhos vão doer por mais uma semana. Dockerfile, é claro, poderia ser ainda pior, não há limite para a perfeição. Mas, para começar, servirá.
Gostaria de terminar com uma citação de Gregory Oster:
Se você ainda não é firme
Eles escolheram a estrada da vida,
E você não sabe o porquê
Trabalhe do seu jeito para começar,
Bata as luzes nas varandas -
As pessoas vão dizer obrigado.
Você vai ajudar as pessoas
Proteger a eletricidade.
UPD : Nos comentários, eles perguntam o que há de errado com esses Dockerfiles. No outro dia, escreverei um artigo separado com uma análise de erros.