3.1 Instrukcja FROM
Tak więc, przypomnę, że Dockerfile to plik tekstowy, który zawiera instrukcje do tworzenia obrazu Docker. Każda instrukcja w Dockerfile wykonuje określone zadanie i tworzy nową warstwę w obrazie. W tym wykładzie bardziej szczegółowo omówimy podstawowe instrukcje Dockerfile: FROM, RUN, COPY oraz CMD, które są kluczowe dla tworzenia funkcjonalnych i efektywnych obrazów Docker.
Instrukcja FROM określa podstawowy obraz, z którego zostanie utworzony nowy obraz. To pierwsza instrukcja w każdym Dockerfile i definiuje punkt początkowy dla budowy obrazu.
Składnia
FROM <image>[:<tag>] [AS <name>]
Gdzie:
<image>: nazwa podstawowego obrazu.<tag>: (opcjonalnie) wersja podstawowego obrazu. Domyślnie używany jestlatest.AS <name>: (opcjonalnie) przypisanie nazwy dla tego etapu budowy (używane w wieloetapowej budowie).
Przykłady
Użycie podstawowego obrazu Ubuntu:
FROM ubuntu:20.04
Użycie oficjalnego obrazu Node.js:
FROM node:14
Użycie wieloetapowej budowy do optymalizacji:
FROM node:14 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
W tym przykładzie używane są dwa podstawowe obrazy. Pierwszy (node:14) jest używany do budowy aplikacji, a drugi (nginx:alpine) — do stworzenia lekkiego serwera, który będzie obsługiwał pliki statyczne.
Dzięki wykorzystaniu wieloetapowej budowy, końcowy obraz zawiera tylko minimalny zestaw plików i programów (w tym przypadku Nginx i zbudowane pliki statyczne), co czyni go bardziej lekkim i szybszym do wdrożenia.
3.2 Instrukcja RUN
Instrukcja RUN wykonuje polecenia wewnątrz kontenera i tworzy nową warstwę w obrazie. Ta instrukcja jest używana do instalacji pakietów, konfiguracji środowiska i wykonywania innych poleceń, niezbędnych do przygotowania obrazu.
Składnia:
RUN <command>
Gdzie:
<command>: polecenie, które będzie wykonane wewnątrz kontenera.
Przykłady:
Instalacja pakietów w obrazie Ubuntu:
RUN apt-get update && apt-get install -y curl git
Kompilacja kodu:
RUN gcc -o myapp myapp.c
Łączenie kilku poleceń
Aby zmniejszyć ilość warstw, rozmiar image i przyspieszyć proces budowy, zaleca się łączyć kilka poleceń w jednej instrukcji RUN.
RUN apt-get update \
&& apt-get install -y curl git \
&& rm -rf /var/lib/apt/lists/*
3.3 Instrukcja COPY
Instrukcja COPY kopiuje pliki i katalogi z kontekstu budowy do systemu plików kontenera. To jest przydatne do przenoszenia kodu źródłowego, plików konfiguracyjnych i innych zasobów do kontenera.
Składnia:
COPY <src> <dest>
Gdzie:
-
<src>: ścieżka do plików lub katalogów w kontekście budowy. <dest>: ścieżka docelowa w kontenerze.
Przykłady:
Kopiowanie całej zawartości bieżącego katalogu do katalogu roboczego kontenera:
COPY . /app
Kopiowanie pojedynczych plików:
COPY package.json /app/package.json
COPY server.js /app/server.js
Użycie .dockerignore
Aby wykluczyć niepotrzebne pliki z procesu kopiowania, można użyć pliku .dockerignore, który działa analogicznie do .gitignore.
node_modules
dist
*.log
3.4 Instrukcja CMD
Instrukcja CMD określa polecenie, które będzie wykonane przy uruchomieniu kontenera. W przeciwieństwie do RUN, która wykonuje się na etapie budowania, CMD uruchamia się przy starcie kontenera z gotowego obrazu.
Składnia:
CMD ["executable","param1","param2"]
Lub
CMD command param1 param2
Gdzie:
- ["executable","param1","param2"]: forma exec, która jest lepsza dla zapewnienia poprawnej obsługi sygnałów.
- command param1 param2: forma
shell, która wykonuje polecenie w powłoce.
Przykłady:
Uruchomienie aplikacji Node.js:
CMD ["node", "app.js"]
Uruchomienie skryptu shell:
CMD /usr/bin/myscript.sh
Różnice między CMD a ENTRYPOINT
CMD określa domyślne polecenie, które można nadpisać podczas uruchamiania kontenera. ENTRYPOINT określa niezmienialne polecenie, które zawsze będzie wykonane przy starcie kontenera.
Przykład użycia ENTRYPOINT:
ENTRYPOINT ["python", "script.py"]
CMD ["arg1"]
W tym przykładzie ENTRYPOINT uruchamia skrypt Python, a CMD przekazuje argumenty, które można zmienić przy starcie kontenera.
Przykładowy Dockerfile z podstawowymi instrukcjami
# Używamy bazowego obrazu Node.js
FROM node:14
# Ustawiamy katalog roboczy
WORKDIR /app
# Kopiujemy pliki package.json i package-lock.json
COPY package*.json ./
# Instalujemy zależności
RUN npm install
# Kopiujemy kod źródłowy aplikacji
COPY . .
# Określamy port, który będzie używany przez aplikację
EXPOSE 3000
# Definiujemy polecenie uruchamiające aplikację
CMD ["node", "app.js"]
GO TO FULL VERSION