Ända sedan jag märkte att den applikation vi förberett har expanderat avsevärt har jag bestämt mig för att hitta en helt ny metod för automatisering av processen för dess lansering. Det var viktigt för mig att hitta en lösning som skulle göra det möjligt att aktivera nya funktioner isolerat.
Inledning
Att upptäcka en enklare metod för processautomatisering skulle innebära en betydande förbättring av mitt arbete och av arbetet för hela min organisation Team. Jag tänkte "Varför inte använda Docker?"
Under förberedelsefasen skapade jag två inställningar: en för frontend-applikationen och den andra för API. Nedan kan du se en presentation av vad jag har lärt mig under utvecklingsprocessen.
Det första problemet
Jag vill ha ett klonat repository i containern, så jag lade till en ssh-nyckel via kommandot ADD i Dockerfile:
ADD ~/.ssh/testowy
Och bam! Filen hittades inte. Varför inte?
Låt oss anta att vi har följande mappstruktur:
docker/
|-- stuff/
| |-- test.txt
|-- Dockerfil
server/
|-- data
| |-- setup.yml
Kör kommandot bygga
i inloggningskö
och du kan bara lägga till filer från den lokala mappen och dess lokala undermappar, t.ex. stuff.
Om du vill lägga till server
kommer du att få ett meddelande: "Kan inte förbereda sammanhang"
Dockerignore
Har du någonsin undrat varför det tar så lång tid att bygga upp en bild? Du kanske inte använde .dockerignore
, för att ignorera filer som inte är nödvändiga i bilden. Den .git
bör tas bort automatiskt liksom alla temporära filer.
Ordningsföljd för kommandon i Dockerfilen
Docker sparar varje rad i Dockerfile och efter byggandet sparas varje rad som ett lager. Det är mycket viktigt att inte ändra ordningen på vissa kommandon alltför ofta.
FRÅN ubuntu
KÖR apt-get install -y programvara-properties-gemensamma 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 installera -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"]
Om du t.ex. ändrar den sista raden i Dockerfile kommer alla tidigare rader att hämtas från cacheminnet medan den sista raden ändras. När du ersätter rad nr 4 kommer alla rader från rad 4 till slutet att ändras. Av den anledningen är det bra att placera kommandon som inte kommer att ändras i början av filen.
Kopiera filer till bild
Det är värt att fundera på vad en viss bild ska användas till. Om du behöver den för att starta en tjänst en gång, kopiera bara kod innehåll direkt till bilden:
KOPIERA . /arbetsdir
Tyvärr gör detta det omöjligt att redigera filer och varje gång du vill redigera din kod måste du bygga upp bilden på nytt.
Om du använder MacOS och vill använda den inbyggda avbildningen för utveckling måste du närma dig den här frågan på ett något annorlunda sätt. Om du kommer att använda volymer måste du vara beredd på att detta är en extremt långsam lösning (t.ex. kopiering av en fil från värden till behållaren sker med en hastighet av 4,5 MB/s, medan kopiering internt i behållaren sker med en hastighet som är 10-20 gånger högre). Lyckligtvis, som du kan se på länkProblemet har varit känt och lösningen är en nyckelfråga för det team som ansvarar för att utveckla Docker för Mac.
Hur kan du använda Docker för utveckling i den här situationen?
Du kan använda den för externa tjänster, t.ex. Redis/PSQL/Elasticsearch eller använda färdiga lösningar som erbjuder rsync: https://github.com/brikis98/docker-osx-dev
Sammanfattningsvis
Om du har ett stort team och vill testa en ny funktion är docker det perfekta verktyget! Men skulle jag använda det för en produktionslansering av en server? Jag är inte helt övertygad än...
Dessutom rekommenderar jag några enastående artiklar: