Lige siden jeg bemærkede, at den applikation, vi udarbejdede, er blevet udvidet betydeligt, har jeg besluttet at finde en helt ny metode til automatisering af processen med at lancere den. Det var vigtigt for mig at finde en løsning, som ville gøre det muligt at aktivere nye funktioner isoleret.
Introduktion
At opdage en enklere metode til procesautomatisering ville være en betydelig forbedring af mit arbejde såvel som hele mit arbejde. hold. Jeg tænkte: "Hvorfor ikke bruge Docker?"
I forberedelsesfasen oprettede jeg to opsætninger: en til frontend-applikationen og en anden til API. Nedenfor kan du se en præsentation af, hvad jeg har lært i løbet af udviklingsprocessen.
Det første problem
Jeg vil gerne have et klonet repository i containeren, så jeg tilføjede en ssh-nøgle via ADD-kommandoen i Dockerfile:
ADD ~/.ssh/testowy
Og bum! Filen blev ikke fundet. Hvorfor ikke?
Lad os antage, at vi har følgende mappestruktur:
docker/
|-- stuff/
| |-- test.txt
|-- Dockerfil
server/
|-- data
| |-- setup.yml
Kør kommandoen bygge
i login-kø
mappen, og du kan kun tilføje filer fra den lokale mappe og dens lokale undermapper, f.eks.
Hvis du vil tilføje Server
mappe, vil du modtage en besked: "Kan ikke forberede kontekst"
Dockerignore
Har du nogensinde undret dig over, hvorfor det tager så lang tid at opbygge et billede? Måske har du ikke brugt .dockerignore
for at ignorere filer, som ikke er nødvendige i billedet. Den .git
mappen bør fjernes automatisk, og det samme gælder alle midlertidige filer.
Rækkefølgen af kommandoer i Dockerfilen
Docker gemmer hver linje i Dockerfile, og efter opbygningen gemmes hver linje som et lag. Det er meget vigtigt ikke at ændre rækkefølgen af bestemte kommandoer for ofte.
FRA ubuntu
KØR apt-get install -y software-properties-common python
RUN add-apt-repository ppa:chris-lea/node.js
RUN echo "deb http://us.archive.ubuntu.com/ubuntu/ precise universe" >> /etc/apt/sources.list
KØR apt-get update
KØR apt-get install -y nodejs
KØR apt-get install -y nodejs=0.6.12~dfsg1-1ubuntu1
KØR mkdir /var/www
ADD app.js /var/www/app.js
CMD ["/usr/bin/node", "/var/www/app.js"]
Hvis du f.eks. ændrer den sidste linje i Dockerfile, vil alle tidligere linjer blive downloadet fra cachen, mens den sidste linje vil blive ændret. Når du udskifter linje 4, vil alle linjer fra linje 4 til slutningen blive ændret. Derfor er det en god idé at placere kommandoer, som ikke skal ændres, i begyndelsen af filen.
Kopiering af filer til billedet
Det er værd at overveje, hvad et givet billede skal bruges til. Hvis du skal bruge det til at starte en tjeneste én gang, skal du bare kopiere Kode indhold direkte til billedet:
COPY . /workdir
Desværre gør det det umuligt at redigere filer, og hver gang du vil redigere din kode, er du nødt til at bygge billedet igen.
Hvis du bruger MacOS og vil bruge det indbyggede image til udvikling, skal du gribe sagen an på en lidt anden måde. Hvis du vil bruge volumener, skal du være forberedt på, at det er en ekstremt langsom løsning (f.eks. sker kopiering af en fil fra værten til containeren med en hastighed på 4,5 MB/s, mens kopiering internt i containeren sker med en hastighed, der er 10-20 gange højere). Heldigvis, som du kan se på LinkProblemet har været kendt, og løsningen er det vigtigste spørgsmål for det team, der er ansvarligt for at udvikle Docker til Mac.
Hvordan kan du bruge Docker til udvikling i denne situation?
Du kan bruge den til eksterne tjenester, f.eks. Redis/PSQL/Elasticsearch, eller bruge færdige løsninger, som tilbyder rsync: https://github.com/brikis98/docker-osx-dev
For at opsummere
Hvis du har et stort team og ønsker at teste en ny funktion, er docker det ideelle værktøj! Men ville jeg bruge det til en produktionslancering af en server? Jeg er ikke helt overbevist endnu...
Derudover anbefaler jeg et par fremragende artikler: