Odkąd zauważyłem, że przygotowywana przez nas aplikacja znacznie się rozrosła, postanowiłem znaleźć zupełnie nową metodę automatyzacji procesu jej uruchamiania. Ważne było dla mnie znalezienie rozwiązania, które umożliwiłoby aktywację nowych funkcji w oderwaniu od innych.
Wprowadzenie
Odkrycie prostszej metody automatyzacji procesów byłoby znaczącym usprawnieniem zarówno mojej pracy, jak i pracy całego mojego zespołu. zespół. Pomyślałem: "Dlaczego nie użyć Dockera?".
Podczas etapu przygotowawczego stworzyłem dwie konfiguracje: jedną dla aplikacji front-end, a drugą dla API. Poniżej możesz zobaczyć prezentację tego, czego nauczyłem się podczas procesu rozwoju.
Pierwszy problem
Chcę mieć sklonowane repozytorium w kontenerze, więc dodałem klucz ssh za pomocą polecenia ADD w pliku Dockerfile:
ADD ~/.ssh/testowy
I bam! Plik nie został znaleziony. Dlaczego?
Załóżmy, że mamy następującą strukturę folderów:
docker/
|-- stuff/
| test.txt
|-- Dockerfile
server/
|-- Dane
| setup.yml
Uruchom polecenie budować
w login-queue
i można dodawać tylko pliki z folderu lokalnego i jego lokalnych podfolderów, np. rzeczy.
Jeśli chcesz dodać serwer
otrzymasz komunikat: "nie można przygotować kontekstu".
Dockerignore
Zastanawiałeś się kiedyś, dlaczego tworzenie obrazu trwa tak długo? Może nie użyłeś .dockerignore
aby zignorować pliki, które nie są potrzebne w obrazie. Plik .git
powinien zostać usunięty automatycznie, podobnie jak wszystkie pliki tymczasowe.
Kolejność poleceń w pliku Dockerfile
Docker zapisuje każdą linię w pliku Dockerfile, a po zbudowaniu każda linia jest zapisywana jako warstwa. Bardzo ważne jest, aby nie zmieniać kolejności poszczególnych poleceń zbyt często.
Z ubuntu
RUN 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"]
Na przykład, jeśli zmienisz ostatnią linię w pliku Dockerfile, wszystkie poprzednie linie zostaną pobrane z pamięci podręcznej, podczas gdy ostatnia linia zostanie zmodyfikowana. W przypadku podmiany linii nr 4, zmodyfikowane zostaną wszystkie linie począwszy od linii 4 do końca. Z tego powodu warto umieszczać komendy, które nie będą się zmieniać, na początku pliku.
Kopiowanie plików do obrazu
Warto zastanowić się, do czego dany obraz będzie używany. Jeśli potrzebujesz go do jednorazowego uruchomienia usługi, po prostu skopiuj plik kod bezpośrednio do obrazu:
COPY . /workdir
Niestety, uniemożliwia to edycję plików i za każdym razem, gdy chcesz edytować kod, musisz ponownie zbudować obraz.
Jeśli korzystasz z macOS i chcesz wykorzystać zbudowany obraz do rozwoju, musisz podejść do tej kwestii w nieco inny sposób. Jeśli będziemy korzystać z wolumenów to musimy być przygotowani, że jest to rozwiązanie ekstremalnie wolne (np. kopiowanie pliku z hosta do kontenera odbywa się z prędkością 4,5 MB/s, podczas gdy kopiowanie wewnątrz kontenera z prędkością 10-20x większą). Na szczęście, jak widać na linkProblem jest znany, a jego rozwiązanie jest kluczową kwestią dla zespołu odpowiedzialnego za rozwój Dockera dla komputerów Mac.
Jak w takiej sytuacji można wykorzystać platformę Docker do programowania?
Można go użyć do zewnętrznych usług, np. Redis/PSQL/Elasticsearch lub skorzystać z gotowych rozwiązań, które oferują rsync: https://github.com/brikis98/docker-osx-dev
Podsumowując
Jeśli masz duży zespół i chcesz przetestować nową funkcję, docker będzie idealnym narzędziem! Niemniej jednak, czy użyłbym go do produkcyjnego uruchomienia serwera? Nie jestem jeszcze do końca przekonany...
Dodatkowo polecam kilka wyróżniających się artykułów: