Docker - dockerfile i warstwy

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 438 razy

Plik dockerfile umożliwia nie tylko wybranie obrazu bazowego, ale również wskazanie folderu docelowego aplikacji, kopiowania plików do obrazu, uruchamianie skryptów wewnątrz kontenera przy jego starcie i wiele, wiele innych. Oto przykładowy plik dockerfile:

FROM node:14 WORKDIR /app COPY / ./ RUN npm install EXPOSE 8888 CMD ["npm", "start"]

Pierwsza linijka to oczywiście ładowanie obrazu bazowego, kolejna WORKDIR to nic innego jak wskazanie folderu bazowego. Polecenie COPY kopiuje zawartość bieżącego folderu (na dysku twardym) do obrazu. Następnie jest RUN, które w tym przypadku instaluje zależności. W moim przypadku stworzyłem mały projekt serwera API z użyciem node-a i modułu express. Kolejna linijka 8888 opisuje port, na którym udostępnione zostanie API. Niestety nie jest to ustawienie, które ma jakiś realny wpływ na to, na którym porcie jest wystawione wewnętrznie API, należy to traktować jako informację nie zaś rzeczywiste ustawienie. W ostatniej linijce polecenie CMD uruchamia serwer.

Każda linijka kodu znajdującego się w pliku dockerfile jest warstwą, oznacza to, że modyfikacja ostatniego polecenia nie będzie miała wpływu na wcześniejsze polecenia i dlatego, jeżeli ulegnie ona zmianie to przy przebudowaniu obrazu nie będzie konieczne wykonanie pozostałych poleceń. Docker wykryje zmiany i przebuduje tylko te warstwy, które tego wymagają.

Przed zbudowaniem obrazu warto dodać plik .dockerignore, w którym można określić pliki do zignorowania:

dockerfile node_modules

Czas zbudować obraz:

docker build -t node-api:1.0 .

co spowoduje zbudowanie obrazu:

[+] Building 9.0s (9/9) FINISHED
 => [internal] load build definition from Dockerfile                                                                                                                                                                            0.0s 
 => [internal] load .dockerignore                                                                                                                                                                                               0.0s 
 => => transferring context: 50B                                                                                                                                                                                                0.0s 
 => [internal] load metadata for docker.io/library/node:14                                                                                                                                                                      0.0s 
 => [internal] load build context                                                                                                                                                                                               1.5s 
 => => transferring context: 4.37MB                                                                                                                                                                                             1.5s 
 => [3/4] COPY / ./                                                                                                                                                                                                             0.2s 
 => [4/4] RUN npm install                                                                                                                                                                                                       7.1s 
 => exporting to image                                                                                                                                                                                                          0.2s 
 => => exporting layers                                                                                                                                                                                                         0.2s 
 => => writing image sha256:e0b890e8b609d5d0e87bd2339593940cc4cc3d755cf6e1891dfb0052a1200733                                                                                                                                    0.0s 
 => => naming to docker.io/library/node-api:1.0                                                                                                                                                                                 0.0s 

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them

No i jeszcze może uruchomić kontener:

docker run -p 8889:8888 --name node node-api:1.0

W moim przypadku wpisując w przeglądarce adres: localhost:8889 mogę zobaczyć zwróconą wartość z serwera API. Pokuszę się jeszcze o sprawdzenie, czy plik dockerfile nie został załączony:

docker container exec node ls
controllers      
index.js
node_modules     
package-lock.json
package.json     
routes

Jak widać plik dockerfile nie istnieje wewnątrz kontenera ale plik node_modules już tak. Jest to spowodowane tą linijką kodu z pliku dockerfile:

RUN npm install
Propozycje książek

Załączniki:

Pliki prostego serwera API napisanego w node