Heim >Betrieb und Instandhaltung >Docker >Machen Sie sich eingehend mit dem DockerFile-Befehl vertraut
Dieser Artikel vermittelt Ihnen relevantes Wissen über den Befehl dockerFile. Jeder Befehl enthält Anweisungen zum Erstellen einer Ebene von Bildproduktionsdateien.
Empfohlene Studie: „Docker-Video-Tutorial“
Dockerfile ist eine Bildproduktionsdatei, die Anweisungen enthält, von denen jede eine Ebene aufbaut.
Erstellen Sie das Image
docker build [选项] <上下文路径/URL/-> docker build -t nginx:v3 . # . 表示Dockerfile在当前目录
FROM gibt das Basis-Image an
Geben Sie das Basis-Image über FROM an, daher ist FROM eine notwendige Anweisung in einer Docker-Datei und muss die erste Anweisung sein.
Von Grund auf ist dieses Bild ein virtuelles Konzept und existiert nicht tatsächlich. Es stellt ein leeres Bild dar. Die folgenden Anweisungen beginnen als erste Ebene des Bildes zu existieren.
RUN-Ausführungsbefehl
RUN wird zum Ausführen von Befehlszeilenbefehlen verwendet. Es gibt zwei Formate:
Shell-Format:
RUN <命令> RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
exec-Format:
RUN ["可执行文件", "参数1", "参数2"]
Union FS hat eine maximale Anzahl von Ebenen, z. B. AUFS. Früher betrug die maximale Anzahl an Ebenen 42, jetzt sind es 127. Dieselbe Funktion sollte && verwenden, um die erforderlichen Befehle zu verketten, um die Anzahl der Spiegelebenen zu vereinfachen Datei oder entpacken Sie die Datei)
COPY [--chown=<user>:<group>] <宿主机源路径> <镜像内的目标路径> COPY [--chown=<user>:<group>] ["<宿主机源路径1>",... "<镜像内的目标路径>"]CMD gibt den Standard-Startbefehl des Container-Hauptprozesses an
# 把当前目录的a.txt文件复制到镜像的根目录 COPY a.txt /a.txt
ADD [--chown=<user>:<group>] http://xxx <目标路径> # 下载文件到镜像的目标路径 ADD [--chown=<user>:<group>] ./a.tar.gz <目标路径> # 复制压缩包,并自动解压到目标路径Wenn Sie beim Ausführen des Docker-Run-it-Images keinen Befehl wie /bin/bash angeben, sh - c cat /a wird automatisch als .txt ausgeführt, andernfalls wird der Startbefehl des Hauptprozesses des Containers gemäß dem vom Benutzer angegebenen CMD
ENTRYPOINT angegeben, ähnlich wie bei CMD
Das Format stimmt mit CMD überein. die Unterschiede1. Verwenden Sie ENTRYPOINT, um Parameter zu übergebenGeben Sie ENTRYPOINT in der Docker-Datei an [ „curl“, „-s“, „http://myip.ipip.net“ ], wenn die Befehlszeile docker run myip - i, der Parameter -i wird an den ENTRYPOINT-Befehl übergeben und schließlich beim Betreten des -Containers Der Container führt Curl -s http://myip.ipip.net -i
2 aus und führt einige Initialisierungsarbeiten durch Das hat nichts mit CMD zu tun. Unabhängig vom CMD des Containers muss im Voraus eine Vorverarbeitung durchgeführt werden.
Ähnlich wie ENTRYPOINT ["docker-entrypoint.sh"] Dieses Skript prüft, ob die Identität des Benutzers legal ist usw.
ENV legt Umgebungsvariablen fest
CMD ["可执行文件", "参数1", "参数2"...]
ARG-Build-Parameter
# 指定进入容器马上指定 cat /a.txt CMD ["sh","-c", "cat /a.txt"]ARG Die Anweisung hat a gültiger Bereich, wenn er vor der FROM-Anweisung angegeben wird, kann er nur in der FROM-Anweisung verwendet werden.
ENV <key> <value> ENV <key1>=<value1> <key2>=<value2>...Wenn nach FROM angegeben, müssen die in jeder Stufe verwendeten Variablen in jeder Stufe separat angegeben werden
ARG <参数名>[=<默认值>]VOLUME anonymes Volume
ARG DOCKER_USERNAME=library FROM ${DOCKER_USERNAME}/alpineUm zu verhindern, dass Benutzer vergessen, das Verzeichnis bereitzustellen, in dem dynamische Dateien während der Laufzeit gespeichert werden Als Volume können Sie in der Docker-Datei bestimmte Verzeichnisse im Voraus angeben, die als anonyme Volumes bereitgestellt werden sollen. Wenn der Benutzer die Bereitstellung zur Laufzeit nicht angibt, kann die Anwendung normal ausgeführt werden, ohne dass große Datenmengen in den Containerspeicher geschrieben werden müssen EbeneHier wird das /data-Verzeichnis automatisch als anonymes Volume bereitgestellt, wenn der Container ausgeführt wird. Alle in /data geschriebenen Informationen werden nicht in der Containerspeicherschicht aufgezeichnet, wodurch die Zustandslosigkeit der Containerspeicherschicht sichergestellt wird.
EXPOSE Exposed Port
FROM ${DOCKER_USERNAME}/alpine # 在FROM 之后使用变量,必须在每个阶段分别指定 ARG DOCKER_USERNAME=library RUN set -x ; echo ${DOCKER_USERNAME}Der EXPOSE-Befehl deklariert den Port, den der Container beim Ausführen bereitstellt. EXPOSE deklariert nur, welchen Port der Container verwenden möchte, und führt nicht automatisch eine Portzuordnung auf dem Host durch. Das Schreiben einer solchen Anweisung in die Docker-Datei hat zwei Vorteile: Zum einen hilft es Image-Benutzern, den Guard-Port des Image-Dienstes zu verstehen, um die Konfigurationszuordnung zu erleichtern Wenn Docker -P ausführt, wird der EXPOSE-Port automatisch und zufällig zugeordnet.
Unterscheiden Sie zwischen EXPOSE und der Verwendung von -p
WorkDir Gibt das Arbeitsverzeichnis an. wird als Root ausgeführt. Wenn Sie die Identität während der Ausführung ändern möchten, beispielsweise wenn Sie einen Dienstprozess als bereits eingerichteter Benutzer ausführen möchten, verwenden Sie nicht su oder sudo. Diese erfordern aufwändigere Konfigurationen und es treten häufig Fehler auf Umgebungen, in denen TTY fehlt. Es wird empfohlen, Gosu zu verwenden.
VOLUME ["<路径1>", "<路径2>"...] VOLUME <路径>HEALTHCHECK teilt Docker mit, wie es feststellen soll, ob der Status des Containers normal ist.
EXPOSE <端口1> [<端口2>...]
Optionen:
WORKDIR <工作目录路径>
Wenn die HEALTHCHECK-Anweisung in einem Image angegeben ist, wird sie zum Starten des Containers verwendet Wenn die Prüfung der HEALTHCHECK-Anweisung erfolgreich ist, wird sie fehlerfrei. HEALTHCHECK kann nur einmal erscheinen. Wenn mehrere geschrieben werden, wird nur der letzte wirksam
CMD 命令的返回值决定了该次健康检查的成功与否:0:成功;1:失败
ONBUILD 指定某些命令只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行
ONBUILD <其它指令>
# 举例如下Dockerfile,初次构建为镜像my-node时,ONBUILD的三行命令不会执行 FROM node:slim RUN mkdir /app WORKDIR /app ONBUILD COPY ./package.json /app ONBUILD RUN [ "npm", "install" ] ONBUILD COPY . /app/ CMD [ "npm", "start" ] # 只要当其他镜像 FROM my-node 从上面镜像作为基础镜像进行构建时,ONBUILD 的命令开始执行
LABEL 为镜像添加元数据
LABEL <key>=<value> <key>=<value> <key>=<value> ...
# 标注镜像的作者 LABEL org.opencontainers.image.authors="yeasy"
SHELL 指定执行shell命令的参数
SHELL ["可执行程序", "参数"]
SHELL ["/bin/sh", "-c"] RUN lll ; ls # 这里的shell命令将通过 /bin/sh -c 的方式执行
推荐学习:《docker视频教程》
Das obige ist der detaillierte Inhalt vonMachen Sie sich eingehend mit dem DockerFile-Befehl vertraut. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!