Etter at jeg oppdaget at applikasjonen vi har utarbeidet har blitt betydelig utvidet, bestemte jeg meg for å finne en helt ny metode for automatisering av lanseringsprosessen. Det var viktig for meg å finne en løsning som ville gjøre det mulig å aktivere nye funksjoner isolert.
Innledning
Å finne en enklere metode for prosessautomatisering vil være en betydelig forbedring av både mitt eget og hele min virksomhets arbeid. team. Jeg tenkte: "Hvorfor ikke bruke Docker?"
I forberedelsesfasen opprettet jeg to oppsett: ett for frontend-applikasjonen og ett for API-et. Nedenfor kan du se en presentasjon av det jeg har lært i løpet av utviklingsprosessen.
Det første problemet
Jeg vil ha et klonet repository i containeren, så jeg la til en ssh-nøkkel via ADD-kommandoen i Dockerfile:
ADD ~/.ssh/testowy
Og pang! Filen ble ikke funnet. Hvorfor ikke?
La oss anta at vi har følgende mappestruktur:
docker/
|-- stuff/
| |-- test.txt
|-- Dockerfile
server/
|-- data
| |-- setup.yml
Kjør kommando bygge
i login-queue
mappen, og du kan bare legge til filer fra den lokale mappen og dens lokale undermapper, f.eks.
Hvis du ønsker å legge til server
får du en melding: "Kan ikke forberede kontekst"
Dockerignore
Har du noen gang lurt på hvorfor det tar så lang tid å bygge opp bildet? Kanskje du ikke brukte .dockerignore
, for å ignorere filer som ikke er nødvendige i bildet. Den .git
mappen skal fjernes automatisk, i tillegg til eventuelle midlertidige filer.
Rekkefølgen av kommandoer i Dockerfilen
Docker lagrer hver linje i Dockerfile, og etter bygging lagres hver linje som et lag. Det er svært viktig å ikke endre rekkefølgen på bestemte kommandoer for ofte.
FRA ubuntu
Kjør apt-get install -y software-properties-common pyton
RUN add-apt-repository ppa:chris-lea/node.js
RUN echo "deb http://us.archive.ubuntu.com/ubuntu/ precise universe" >> /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y nodejs
RUN apt-get install -y nodejs=0.6.12~dfsg1-1ubuntu1
RUN mkdir /var/www
ADD app.js /var/www/app.js
CMD ["/usr/bin/node", "/var/www/app.js"]
Hvis du for eksempel endrer den siste linjen i Dockerfile, vil alle tidligere linjer lastes ned fra hurtigbufferen mens den siste linjen blir endret. Når du erstatter linje nr. 4, vil alle linjer fra linje 4 til slutten bli endret. Av denne grunn er det lurt å plassere kommandoer som ikke skal endres, i begynnelsen av filen.
Kopiering av filer til image
Det er verdt å tenke over hva et gitt bilde skal brukes til. Hvis du trenger det til å starte en tjeneste én gang, kopierer du bare kode innhold direkte til bildet:
COPY . /workdir
Dessverre gjør dette det umulig å redigere filer, og hver gang du vil redigere koden din, må du bygge bildet på nytt.
Hvis du bruker MacOS og ønsker å bruke det innebygde avbildningen til utvikling, må du tilnærme deg denne saken på en litt annen måte. Hvis du vil bruke volumer, må du være forberedt på at dette er en ekstremt treg løsning (f.eks. kopiering av en fil fra verten til containeren gjøres med en hastighet på 4,5 MB/s, mens kopiering internt i containeren gjøres med en hastighet som er 10-20 ganger høyere). Heldigvis, som du kan se på lenkeproblemet har vært kjent, og løsningen er det viktigste for teamet som er ansvarlig for utviklingen av Docker for Mac.
Hvordan kan du bruke Docker til utvikling i denne situasjonen?
Du kan bruke den til eksterne tjenester, f.eks. Redis/PSQL/Elasticsearch, eller bruke ferdige løsninger som tilbyr rsync: https://github.com/brikis98/docker-osx-dev
For å oppsummere
Hvis du har et stort team og ønsker å teste en ny funksjon, vil docker være det ideelle verktøyet! Likevel, ville jeg brukt det til en produksjonslansering av en server? Jeg er ikke helt overbevist ennå...
I tillegg anbefaler jeg noen fremragende artikler: