Stronę tą wyświetlono już: 566 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:
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:
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: