Docker
Bygga bilder
Sök…
parametrar
Parameter | detaljer |
---|---|
--dra | Se till att basbilden ( FROM ) är uppdaterad innan du bygger resten av Dockerfile. |
Bygga en bild från en Dockerfile
När du har en Dockerfile kan du bygga en bild från den med docker build
. Den grundläggande formen för detta kommando är:
docker build -t image-name path
Om din Dockerfile inte heter Dockerfile
, kan du använda flaggan -f
att ge namnet på Dockerfile att bygga.
docker build -t image-name -f Dockerfile2 .
För att till exempel bygga en bild med namnet dockerbuild-example:1.0.0
från en Dockerfile
i den aktuella arbetskatalogen:
$ ls
Dockerfile Dockerfile2
$ docker build -t dockerbuild-example:1.0.0 .
$ docker build -t dockerbuild-example-2:1.0.0 -f Dockerfile2 .
Se docker build
användardokumentationen för fler alternativ och inställningar.
Ett vanligt misstag är att skapa en Dockerfile i användarkatalogen ( ~
). Det här är en dålig idé eftersom under docker build -t mytag .
detta meddelande kommer att visas under lång tid:
Överför sammanhang
Orsaken är dockningsdemonet som försöker kopiera alla användarens filer (både hemkatalogen och dess underkataloger). Undvik detta genom att alltid ange en katalog för Dockerfile.
Att lägga till en .dockerignore
fil i build-katalogen är en bra praxis . Syntaxen liknar .gitignore
filer och kommer att se till att bara önskade filer och kataloger laddas upp som sammanhanget för build.
En enkel Dockerfile
FROM node:5
FROM
direktivet anger en bild att börja med. Varje giltig bildreferens kan användas.
WORKDIR /usr/src/app
WORKDIR
direktivet sätter den aktuella arbetskatalogen inuti behållaren, motsvarande att köra cd
inuti behållaren. (Obs: RUN cd
kommer inte att ändra den aktuella arbetskatalogen.)
RUN npm install cowsay knock-knock-jokes
RUN
kör det givna kommandot inne i behållaren.
COPY cowsay-knockknock.js ./
COPY
kopierar den fil eller katalog som anges i det första argumentet från bygg sammanhang ( path
vidare till docker build path
) till den plats i behållaren anges av det andra argumentet.
CMD node cowsay-knockknock.js
CMD
anger ett kommando som ska köras när bilden körs och inget kommando ges. Det kan åsidosättas genom att skicka ett kommando till docker run
.
Det finns många andra instruktioner och alternativ; se Dockerfile-referensen för en komplett lista.
Skillnaden mellan ENTRYPOINT och CMD
Det finns två Dockerfile
direktiv som anger vilket kommando som ska köras som standard i inbyggda bilder. Om du bara anger CMD
kommer dockaren att köra det kommandot med standard ENTRYPOINT
, som är /bin/sh -c
. Du kan åsidosätta antingen eller både startpunkten och / eller kommandot när du startar den inbyggda bilden. Om du anger båda, anger ENTRYPOINT
körbara för din containerprocess, och CMD
kommer att levereras som parametrarna för den körbara.
Till exempel om din Dockerfile
innehåller
FROM ubuntu:16.04
CMD ["/bin/date"]
Sedan använder du standard ENTRYPOINT
direktivet för /bin/sh -c
och kör /bin/date
med det standardinföringspunktet. Kommandot för din containerprocess är /bin/sh -c /bin/date
. När du kör den här bilden kommer den som standard att skriva ut det aktuella datumet
$ docker build -t test .
$ docker run test
Tue Jul 19 10:37:43 UTC 2016
Du kan åsidosätta CMD
på kommandoraden, i vilket fall det kommer att köra det kommando du har angett.
$ docker run test /bin/hostname
bf0274ec8820
Om du anger ett ENTRYPOINT
direktiv kommer Docker att använda det körbara, och CMD
direktivet anger kommandans standardparameter. Så om din Dockerfile
innehåller:
FROM ubuntu:16.04
ENTRYPOINT ["/bin/echo"]
CMD ["Hello"]
Sedan kör det kommer att producera
$ docker build -t test .
$ docker run test
Hello
Du kan tillhandahålla olika parametrar om du vill, men alla kör /bin/echo
$ docker run test Hi
Hi
Om du vill åsidosätta startpunkten som listas i din Dockerfile (dvs. om du vill köra ett annat kommando än echo
i den här behållaren) måste du ange parametern --entrypoint
på kommandoraden:
$ docker run --entrypoint=/bin/hostname test
b2c70e74df18
Generellt använder du ENTRYPOINT
direktivet för att peka på ditt huvudapplikation du vill köra och CMD
till standardparametrarna.
Att exponera en hamn i Dockerfile
EXPOSE <port> [<port>...]
EXPOSE
instruktionen informerar Docker att behållaren lyssnar på de angivna nätverksportarna under körning.EXPOSE
gör inte portarna i behållaren tillgängliga för värden. För att göra det måste du använda antingen-p
flaggan för att publicera ett antal portar eller-P
flaggan för att publicera alla exponerade portar. Du kan exponera ett portnummer och publicera det externt under ett annat nummer.
Exempel:
Inuti din Dockerfile:
EXPOSE 8765
För att komma åt denna port från värdmaskinen, inkludera detta argument i ditt docker run
kommando:
-p 8765:8765
ENTRYPOINT och CMD ses som verb och parameter
Anta att du har en Dockerfile som slutar med
ENTRYPOINT [ "nethogs"] CMD ["wlan0"]
om du bygger den här bilden med en
docker built -t inspector .
starta bilden byggd med en sådan Dockerfile med ett kommando som
docker run -it --net=host --rm inspector
, nethogs kommer att övervaka gränssnittet som heter wlan0
Om du nu vill övervaka gränssnittet eth0 (eller wlan1 eller ra1 ...) kommer du att göra något liknande
docker run -it --net=host --rm inspector eth0
eller
docker run -it --net=host --rm inspector wlan1
Tryck och dra en bild till Docker Hub eller ett annat register
Lokalt skapade bilder kan skjutas till Docker Hub eller någon annan dockningsrepo-värd, känd som ett register. Använd docker login
att logga in på ett befintligt docker-hubkonto.
docker login
Login with your Docker ID to push and pull images from Docker Hub.
If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: cjsimon
Password:
Login Succeeded
Ett annat dockningsregister kan användas genom att ange ett servernamn. Detta fungerar också för privata eller självhostade register. Vidare är det möjligt att använda en extern referenslager för säkerhet.
docker login quay.io
Du kan sedan tagga och skjuta bilder till det register som du är inloggad på. Ditt arkiv måste anges som server/username/reponame:tag
. Att utelämna servern är för närvarande standard för Docker Hub. (Standardregistret kan inte ändras till en annan leverantör, och det finns inga planer för att implementera den här funktionen.)
docker tag mynginx quay.io/cjsimon/mynginx:latest
Olika taggar kan användas för att representera olika versioner eller grenar av samma bild. En bild med flera olika taggar visar varje tagg i samma repo.
Använd docker images
att se en lista över installerade bilder installerade på din lokala maskin, inklusive din ny taggade bild. Använd sedan tryck för att ladda upp den till registret och dra för att ladda ner bilden.
docker push quay.io/cjsimon/mynginx:latest
Alla taggar på bilder kan dras genom att ange alternativet -a
docker pull quay.io/cjsimon/mynginx:latest
Bygga med hjälp av en proxy
Ofta när man bygger en Docker image, Dockerfile innehåller anvisningar som kör program för att hämta resurser från Internet ( wget
till exempel att dra ett program binär bygga på GitHub till exempel).
Det är möjligt att instruera Docker att passera inställda miljövariabler så att sådana program utför dessa hämtningar genom en proxy:
$ docker build --build-arg http_proxy=http://myproxy.example.com:3128 \
--build-arg https_proxy=http://myproxy.example.com:3128 \
--build-arg no_proxy=internal.example.com \
-t test .
build-arg
är miljövariabler som endast är tillgängliga vid byggtid.