GNU/Linux >> Znalost Linux >  >> Ubuntu

Docker CMD vs. Entrypoint Commands:Jaký je rozdíl?

Úvod

Kontejnery jsou navrženy pro spouštění konkrétních úloh a procesů , nikoli pro hostování operačních systémů. Vytvoříte kontejner, který bude sloužit jedné jednotkové úloze. Jakmile daný úkol dokončí, zastaví se . Životní cyklus kontejneru proto závisí na probíhajícím procesu v něm. Jakmile se proces zastaví, zastaví se i kontejner.

Dockerfile definuje tento proces. Je to skript složený z pokynů, jak vytvořit image Docker. V tomto skriptu existují dva typy pokynů který může definovat proces běžící v kontejneru:

  • VSTUPNÍ BOD
  • CMD

V tomto článku vysvětlujeme rozdíly mezi Docker ENTRYPOINT a CMD a kdy použít kterou instrukci Dockeru.

Docker Entrypoint vs CMD:Řešení dilematu

Stručně řečeno, CMD definuje výchozí příkazy a/nebo parametry pro kontejner. CMD je instrukce, kterou je nejlepší použít, pokud potřebujete výchozí příkaz, který mohou uživatelé snadno přepsat. Pokud má Dockerfile více CMD, použije pouze instrukce z posledního.

Na druhé straně VSTUPNÍ BOD je preferováno, když chcete definovat kontejner s konkrétním spustitelným souborem. Při spouštění kontejneru nemůžete přepsat VSTUPNÍ BOD, pokud nepřidáte --entrypoint vlajka.

Kombinovat ENTRYPOINT s CMD pokud potřebujete kontejner se zadaným spustitelným souborem a výchozím parametrem, který lze snadno upravit. Například při kontejnerizaci aplikace použijte ENTRYPOINT a CMD k nastavení proměnných specifických pro prostředí.

Formulář Shell a Exec

Než začneme, je důležité probrat formy pokynů. Docker ENTRYPOINT a CMD mohou mít dvě podoby:

  • Formulář shellu
  • Formulář Exec

Syntaxe jakéhokoli příkazu ve formě shellu je:

<instruction> <command>

Syntaxe pro instrukce ve formě exec je:

<instruction> ["executable", "parameter"]

Docker CMD/ENTRYPOINT instrukce můžete napsat v obou formách:

  • CMD echo "Hello World" (skořápka)
  • CMD ["echo", "Hello World"] (exec formulář)
  • ENTRYPOINT echo "Hello World" (skořápka)
  • ENTRYPOINT ["echo", "Hello World"] (exec formulář)

Snažte se však všechny pokyny uchovávat ve exec formě abyste předešli potenciálním problémům s výkonem.

Docker CMD

Docker CMD definuje výchozí spustitelný soubor obrazu Docker. Tento obrázek můžete spustit jako základ kontejneru bez přidávání argumentů příkazového řádku. V takovém případě kontejner spustí proces určený příkazem CMD.

Instrukce CMD se použije pouze v případě, že do run není přidán žádný argument příkaz při spouštění kontejneru. Pokud tedy do příkazu přidáte argument, přepíšete CMD.

Abychom vám ukázali, jak CMD funguje, vytvoříme vzorový kontejner s instrukcí CMD.

Vytvoření souboru Docker pomocí CMD a vytvoření obrázku

1. Začněte vytvořením nového MyDockerImage složka pro ukládání obrázků:

sudo mkdir MyDockerImage

2. Přesuňte se do této složky a vytvořte nový soubor Docker:

cd MyDockerImage
sudo touch Dockerfile

3. Otevřete Dockerfile pomocí svého oblíbeného textového editoru:

nano Dockerfile

4. Poté do souboru přidejte následující obsah:

FROM ubuntu
MAINTAINER sofija
RUN apt-get update
CMD ["echo", "Hello World"]

Ve výše uvedeném obsahu můžete vidět, že jsme použili instrukci CMD k opakování zprávy Hello World když se kontejner spustí bez zadaného příkazu.

5. Uložit a ukončit soubor.

6. Dalším krokem je vytvoření obrazu Dockeru z nově vytvořeného souboru Dockerfile. Protože jsme stále v MyDockerImage adresář, nemusíte zadávat umístění souboru Dockerfile, stačí vytvořit obrázek spuštěním:

sudo docker build .

7. Výstup vám sdělí název kontejneru. Můžete zkontrolovat, zda je k dispozici mezi lokálně uloženými obrázky spuštěním:

sudo docker images

Spuštění kontejneru Docker s CMD

Abychom viděli CMD v akci, vytvoříme kontejner na základě obrázku vytvořeného v předchozím kroku.
Spusťte kontejner pomocí příkazu:

sudo docker run [image_name]

Protože neexistuje žádný argument příkazového řádku, kontejner spustí výchozí instrukci CMD a zobrazí Hello World zpráva. Pokud však přidáte argument při spouštění kontejneru, přepíše instrukci CMD.

Například do příkazu spuštění dockeru přidejte argument hostname:

sudo docker run [image_name] hostname

Docker spustí kontejner a hostname místo příkazu echo CMD. Můžete to vidět ve výstupu.

Vstupní bod dockeru

ENTRYPOINT je další instrukce používaná ke konfiguraci toho, jak bude kontejner běžet. Stejně jako u CMD musíte zadat příkaz a parametry.

Jaký je rozdíl mezi CMD a ENTRYPOINT? Instrukci ENTRYPOINT nelze přepsat přidáním parametrů příkazového řádku do docker run příkaz. Tím, že se rozhodnete pro tento pokyn, naznačujete, že kontejner je speciálně vyroben pro takové použití.

Čtěte dále, abyste viděli, jak používáme ENTRYPOINT při vytváření kontejneru.

Vytvoření souboru Docker pomocí ENTRYPOINT a vytvoření obrázku

1. Použijte Dockerfile vytvořený v sekci CMD a upravte soubor pro změnu instrukce. Otevřete existující soubor pomocí textového editoru:

sudo nano Dockerfile

2. Upravte obsah nahrazením příkazu CMD za ENTRYPOINT:

FROM ubuntu
MAINTAINER sofija
RUN apt-get update
ENTRYPOINT ["echo", "Hello World"]

3. Uložit a zavřít soubor.

Spuštění kontejneru Docker s ENTRYPOINT

1. Vytvořte nový obraz pomocí následujícího příkazu:

sudo docker build .

2. Výstup by měl ukazovat, že jste úspěšně vytvořili nový obrázek pod daným jménem. Nyní jej spusťte jako kontejner bez přidávání parametrů příkazového řádku:

sudo docker run [container_name]

Výstup bude stejný jako u CMD. Je to proto, že jsme do příkazu run nepřidali žádné argumenty.

3. Chcete-li vidět, jak ENTRYPOINT funguje, musíte při spouštění kontejneru přidat parametr. Použijte stejný příkaz jako v předchozím kroku a přidejte něco za název kontejneru:

sudo docker run [container_name] KnowledgeBase

Jak vidíte, Docker nepřepsal počáteční pokyn opakování Hello World. Pouze přidal nový parametr do existujícího příkazu.

Ačkoli můžete použít ENTRYPOINT a CMD v obou formách, obecně se doporučuje držet se formuláře exec . Toto je spolehlivější řešení, protože forma shellu může občas způsobit jemné problémy v procesu.

Vstupní bod dockeru s CMD

Jak jste doposud viděli, ENTRYPOINT a CMD jsou podobné, ale ne stejné. A co víc, tyto dva pokyny se vzájemně nevylučují. Je to tak, je možné mít v Dockerfile obojí.

Existuje mnoho situací, ve kterých by kombinace CMD a ENTRYPOINT byla nejlepším řešením pro váš kontejner Docker. V takových případech je spustitelný soubor definován pomocí ENTRYPOINT , zatímco CMD určuje výchozí parametr .

Pokud používáte oba pokyny, ujistěte se, že je máte ve formátu exec .

Čtěte dále, abyste viděli, jak ENTRYPOINT a CMD spolupracují v našem příkladu.

Spusťte kontejner s Entrypoint a CMD

1. Nejprve upravíme náš stávající soubor Dockerfile tak, aby obsahoval oba pokyny. Otevřete soubor pomocí:

sudo nano Dockerfile

2. Soubor by měl obsahovat instrukci ENTRYPOINT specifikující spustitelný soubor a také instrukci CMD definující výchozí parametr, který by se měl objevit, pokud do příkazu run nejsou přidány žádné další:

FROM ubuntu
MAINTAINER sofija
RUN apt-get update
ENTRYPOINT ["echo", "Hello"]
CMD ["World"]

3. Nyní vytvořte nový obraz z upraveného souboru Dockerfile:

sudo docker build . 

4. Otestujeme kontejner spuštěním bez jakýchkoli parametrů. Zadejte příkaz:

sudo docker run [container_name]

Vrátí zprávu Hello World . Co se však stane, když do příkazu spuštění dockeru přidáme parametry?

5. Použijte stejný příkaz znovu, ale tentokrát do příkazu run přidejte své jméno:

sudo docker run [container_name] [your_name]

Výstup se nyní změnil na Hello [your_name] (v mém případě je to Hello Sofija ). Je to proto, že nemůžete přepsat instrukce ENTRYPOINT, zatímco s CMD to můžete snadno udělat.


Ubuntu
  1. Jaký je rozdíl mezi kontejnery LXC, LXD a Docker

  2. Je rozdíl mezi Sudo a Gksu stejný jako rozdíl mezi Sudo -i a Sudo -s?

  3. Rozdíl mezi CMD a ENTRYPOINT v Docker Images

  1. rozdíl mezi podmanem a dockerem.

  2. Některé příkazy DOCKER

  3. Spuštění shellu v kontejneru Docker Alpine

  1. Kontejnery vs virtuální stroje (VM):Jaký je rozdíl?

  2. Jak vložit SSH do běžícího kontejneru Docker a spustit příkazy

  3. APT vs APT-GET:Jaký je rozdíl?