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