Pokud jste někdy potřebovali při spuštění spustit jeden nebo dva příkazy v kontejneru Docker, tento návod je pro vás. Pomocí Dockerfile ENTRYPOINT
a CMD
instrukcí, můžete spustit tolik příkazů pro spuštění, kolik chcete.
V tomto tutoriálu se naučíte používat VSTUPNÍ POINT
a CMD
pokyny ke spouštění spouštěcích příkazů v Dockerfile a pochopení rozdílů mezi nimi.
Předpoklady
Protože tento tutoriál bude praktickou ukázkou, ujistěte se, že máte následující:
- V tomto kurzu byl použit počítač se systémem Windows 10 – Windows 10 v10.0.19042.
- Docker Desktop – Tento výukový program používá Docker Desktop v3.3.1.
Vytvoření souboru Dockerfile
Než budete moci spouštět příkazy pro spuštění kontejneru Docker, musíte nejprve vytvořit soubor Dockerfile. Dockerfile je textový dokument, který obsahuje seznam příkazů pro vytváření kontejnerů, obrázků Docker a určuje, jak se vytváří obrázek Docker.
1. Nejprve otevřete PowerShell jako správce.
2. Vytvořte novou složku pro uložení souboru Dockerfile a všech souvisejících souborů, které bude tento výukový program používat, a změňte se do tohoto adresáře. Tento tutoriál používá ~/docker .
mkdir ~/docker
cd docker
3. Nyní vytvořte prázdný textový soubor s názvem Dockerfile s následujícím příkazem.
cd > Dockerfile
Případně můžete vytvořit Dockerfile pomocí následujícího příkazu, pokud používáte Linux nebo Mac OS.
touch Dockerfile
4. Nakonec přidejte následující obsah do Dockerfile
FROM ubuntu:20.04
Nyní jste vytvořili brzký soubor Dockerfile!
Vytvoření obrázku dockeru
Nyní, když jste vytvořili svůj Dockerfile, musíte vytvořit obraz Dockeru, abyste mohli provádět příkazy zapsané v pokynech ENTRYPOINT a CMD Dockerfile. Jedním ze způsobů, jak vytvořit obrázek, je použít build
příkaz.
V ~/docker adresáře, spusťte následující příkaz. Níže uvedený příkaz vytvoří obrázek Docker s názvem demo (-t demo
) ze souboru Dockerfile v ~/docker zadáním aktuálního pracovního adresáře (.
).
docker build -t demo .

Spuštění kontejneru Docker
Po vytvoření obrazu Dockeru budete potřebovat kontejner ke spuštění obrazu Dockeru, který bude provádět příkazy z instrukcí ENTRYPOINT a CMD Dockerfile.
Chcete-li spustit kontejner Docker, vyvolejte run
příkaz k vytvoření zapisovatelné vrstvy kontejneru přes obrázek Docker (demo
). Níže uvedený příklad používá -it
parametr pro interaktivní připojení ke kontejneru, abyste viděli ukázkový výstup.
docker run -it demo

Formulář Exec vs. Shell
Když začnete pracovat s Dockerfile a zjistíte, jak spouštět spouštěcí příkazy, můžete narazit na dvě různé metody definování těchto příkazů. Každá metoda vyvolá příkazy, ale dělá to trochu jinak.
Když Docker spouští příkazy, může tak činit přímo s názvem exec
nebo projděte shell kontejneru (/bin/sh -c
v systému Linux nebo cmd /S /C
v systému Windows) s názvem shell
.
Všimnete si příkazů spouštěných pomocí exec
mít instrukci následovanou spustitelnými soubory k vyvolání následovanou jedním nebo více argumenty příkazového řádku, jak je uvedeno níže.
ENTRYPOINT ["executables", "parameter1", "parameter2", ...]
CMD ["executables", "parameter1", "parameter2:, ...]
Psaní příkazů v shell
formulář na druhé straně nevyžaduje zalamování příkazů do hranatých závorek, jak je uvedeno níže.
ENTRYPOINT <command> "parameter1"
CMD <command> "parameter1"
Pokud nezadáte argument pro
CMD
, Docker vždy provede příkaz ve formě exec, např.CMD
.
Pokud právě začínáte, na rozdílu mezi těmito dvěma vyvoláním příkazů nebude příliš záležet, ale jak budete pokročilejší, brzy uvidíte výhody a nevýhody každého z nich.
Spouštění příkazů při spuštění
Pojďme se nyní pustit do jádra tohoto tutoriálu a ušpinit si ruce tím, že si projdeme několik příkladů spouštění spouštěcích příkazů v rámci Dockerfile ENTRYPOINT
a instrukce CMD.
1. Otevřete soubor Dockerfile, který jste vytvořili dříve, ve vašem preferovaném textovém editoru.
2. Zkopírujte a vložte ukázkový obsah Dockerfile do vašeho Dockerfile, jak je znázorněno níže, a uložte jej.
Tento Dockerfile vytvoří vrstvu pomocí ubuntu:20.04
jako základní obrázek. Poté řekne Dockeru, aby vyvolal echo
předá mu příkaz Ahoj světe
argument pro oba Dockerfile CMD
a VSTUPNÍ BOD
instrukce pomocí exec
a shell
formulář.
FROM ubuntu:20.04
# CMD Instruction
CMD ["echo", "Hello world"] # Exec Form
CMD echo "Hello world" # Shell Form
# ENTRYPOINT Instruction
ENTRYPOINT ["echo", "Hello world"] # Exec Form
ENTRYPOINT echo "Hello world" # Shell Form
3. V ~/docker adresář, vytvořte nový obraz spuštěním docker build
a nazvěte to demo
. Příkaz níže tags obrázek jako demo
a hledá Dockerfile v aktuálním pracovním adresáři (.
).
docker build -t demo .

4. Nyní spusťte kontejner pomocí obrazu a poté spusťte kontejner Docker na základě obrazu Dockeru vytvořeného dříve. Nyní uvidíte, že kontejner vrací Ahoj světe
který pochází z CMD
instrukce uvedené v Dockerfile.
docker run -it demo

Použití proměnných v Dockerfile
Někdy nemusíte znát přesné argumenty příkazového řádku, které je třeba předat příkazu předem. Argumenty, které musíte předat příkazu, jsou vystaveny pouze za běhu. Namísto statického přiřazování argumentů příkazu můžete tyto argumenty zachytit a předat příkazům s proměnnými.
Proměnné Dockerfile můžete používat pouze v
shell
formulář. Docker nepodporuje proměnné v příkazu vyvolaném pomocíexec
formulář.
Znovu otevřete soubor Dockerfile v preferovaném textovém editoru, nahraďte vše uvnitř následující řadou příkazů a uložte jej.
Tentokrát si všimnete, že Dockerfile používá proměnné prostředí a zobrazuje se pomocí ENV
. V níže uvedeném příkladu definuje Dockerfile proměnnou prostředí s názvem name
s hodnotou friend
. Po vytvoření se na tuto proměnnou prostředí odkazuje pomocí $name
.
Když Docker spustí kontejner založený na tomto Dockerfile, vyvolá echo
a předejte argument Vítejte, příteli
.
FROM ubuntu:20.04
ENV name friend
CMD echo "Welcome, $name"
# or
## ENTRYPOINT echo "Welcome, $name"
Nyní vytvořte obrázek Docker a spusťte kontejner znovu, volitelně s názvem značky shellform
. Všimnete si, že Docker vyvolal echo
a vrátil očekávaný výstup.

Kombinace pokynů ENTRYPOINT Dockerfile a CMD
Většinu času budete spouštěcí příkazy vyvolávat buď v instrukci CMD nebo ENTRYPOINT. Koneckonců, pomocí každé metody můžete vyvolat tolik příkazů, kolik chcete. Můžete však také vyvolat jeden příkaz a „vybudovat na něm“ pomocí obou pokynů.
Na základě předchozích příkladů možná máte soubor Dockerfile, který vypadá jako příklad níže. Jak je, pokud vytvoříte obrázek a spustíte kontejner z tohoto obrázku, Docker vyvolá echo
příkaz a návrat Ahoj
.
FROM ubuntu:20.04
ENTRYPOINT ["echo", "Hello"]
Možná máte další argument, který byste chtěli předat echo
příkaz, ale ne hned. Možná byste to chtěli udělat dále v Dockerfile. Voláním CMD
instrukce bez příkazu, můžete tak učinit.
Když zadáte příkaz ke spuštění prostřednictvím
ENTRYPOINT
instrukce následovanáCMD
Docker automaticky převezme hodnotu předávanouCMD
je argument; není příkaz.
Nyní přidejte CMD
odkaz na instrukce bez příkazu, jen argument nazvaný world
, jak je uvedeno níže.
FROM ubuntu:20.04
ENTRYPOINT ["echo", "Hello"]
CMD ["world"]
Instrukce Ckombinace by měly být vždy psány ve formě exec kvůli jeho chování „jako v poli“, kdy specifikuje hodnoty jednotlivě oddělené čárkami oproti všem v jednom řetězci.
Po vytvoření obrázku a spuštění kontejneru z obrázku můžete vidět, že místo dvou řádků výstupu (Ahoj
a svět
), Docker vrátí pouze jeden, což znamená pouze jeden echo
vyvolání příkazu.

Závěr
Nyní byste měli dobře rozumět spouštění příkazů pro spuštění kontejneru Docker prostřednictvím obou CMD
a VSTUPNÍ BOD
Pokyny pro dockerfile. Každá instrukce je trochu jiná, ale plní stejný úkol a lze ji dokonce použít společně.
Napadá vás scénář, kdy byste raději používali CMD
přes VSTUPNÍ BOD
spustit spouštěcí příkaz?