Sinds ik heb gemerkt dat de applicatie die we hebben gemaakt aanzienlijk is uitgebreid, heb ik besloten om een compleet nieuwe methode te vinden voor het automatiseren van het lanceringsproces. Het was belangrijk voor mij om een oplossing te vinden die het mogelijk zou maken om nieuwe functies geïsoleerd te activeren.
Inleiding
Het ontdekken van een eenvoudigere methode voor procesautomatisering zou een aanzienlijke verbetering betekenen voor mijn werk en dat van mijn hele organisatie. team. Ik dacht: "Waarom geen Docker gebruiken?"
Tijdens de voorbereidingsfase heb ik twee setups gemaakt: een voor de front-end applicatie en een voor de API. Hieronder zie je een presentatie van wat ik tijdens het ontwikkelproces heb geleerd.
Het eerste probleem
Ik wil een gekloonde repository in de container hebben, dus ik heb een ssh sleutel toegevoegd via het ADD commando in Dockerfile:
ADD ~/.ssh/testowy
En bam! Het bestand is niet gevonden. Waarom niet?
Laten we aannemen dat we de volgende mappenstructuur hebben:
docker/
|-- stuff/
| - test.txt
|-- Dockerbestand
server/
| data
| setup.yml
Opdracht uitvoeren bouwen
in de login-queue
map en je kunt alleen bestanden toevoegen uit de lokale map en de lokale submappen daarvan, bijvoorbeeld stuff.
Als u de server
map, krijg je een bericht: "kan context niet voorbereiden".
Dockerignore
Heb je je ooit afgevraagd waarom het zo lang duurt om een afbeelding op te bouwen? Misschien heb je geen .dockerignore
om bestanden te negeren die niet nodig zijn in de afbeelding. De .git
map moet automatisch worden verwijderd, evenals alle tijdelijke bestanden.
Volgorde van commando's in Dockerfile
Docker slaat elke regel op in Dockerfile en na het bouwen wordt elke regel opgeslagen als een laag. Het is erg belangrijk om de volgorde van bepaalde commando's niet te vaak te veranderen.
vanaf ubuntu
RUN 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
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"]
Als je bijvoorbeeld de laatste regel in Dockerfile wijzigt, worden alle vorige regels uit de cache gedownload terwijl de laatste regel wordt gewijzigd. Als je regel 4 vervangt, dan worden alle regels vanaf regel 4 tot het einde gewijzigd. Daarom is het de moeite waard om commando's die niet veranderen aan het begin van het bestand te plaatsen.
Bestanden kopiëren naar een afbeelding
Het is de moeite waard om te overwegen waarvoor een bepaalde afbeelding zal worden gebruikt. Als je het nodig hebt om een service eenmalig te starten, kopieer dan gewoon de code inhoud rechtstreeks naar de afbeelding:
KOPIE . /werkdir
Helaas maakt dit het onmogelijk om bestanden te bewerken en elke keer als je je code wilt bewerken, moet je de afbeelding opnieuw bouwen.
Als je MacOS gebruikt en de gebouwde image wilt gebruiken voor ontwikkeling, dan moet je deze zaak op een iets andere manier benaderen. Als je volumes gaat gebruiken, moet je er rekening mee houden dat dit een extreem langzame oplossing is (bijvoorbeeld het kopiëren van een bestand van de host naar de container gebeurt met een snelheid van 4,5 MB/s, terwijl het kopiëren intern in de container met een 10-20x hogere snelheid gebeurt). Gelukkig, zoals je kunt zien op linkHet probleem is bekend en de oplossing ervan is de belangrijkste kwestie voor het team dat verantwoordelijk is voor de ontwikkeling van Docker voor Mac.
Hoe kun je Docker in deze situatie gebruiken voor ontwikkeling?
Je kunt het gebruiken voor externe diensten, bijvoorbeeld Redis/PSQL/Elasticsearch of kant-en-klare oplossingen gebruiken die rsync bieden: https://github.com/brikis98/docker-osx-dev
Samengevat
Als je een groot team hebt en een nieuwe functie wilt testen, is docker de ideale tool! Maar zou ik het gebruiken voor een productielancering van een server? Ik ben nog niet helemaal overtuigd...
Daarnaast raad ik een paar uitstekende artikelen aan: