ホームページ  >  記事  >  運用・保守  >  DockerFile コマンドを詳しく理解します。

DockerFile コマンドを詳しく理解します。

WBOY
WBOY転載
2022-02-22 17:40:252145ブラウズ

この記事では、dockerFile コマンドに関する関連知識を提供します。このコマンドには、指示が 1 つずつ含まれています。各指示により、イメージ制作ファイルのレイヤーが構築されます。皆様のお役に立てれば幸いです。

DockerFile コマンドを詳しく理解します。

推奨学習: 「docker ビデオ チュートリアル

DockerFile コマンドの詳細な説明

Dockerfile には、次の手順が含まれています。 1 つの命令ごとに、イメージ生成ファイルのレイヤーが構築されます。

イメージを構築します

docker build [选项] <上下文路径/URL/->

docker build -t nginx:v3 .           # . 表示Dockerfile在当前目录

FROM でベース イメージを指定します

FROM でベース イメージを指定します。そのため、FROM は必須ですデバイスの Dockerfile コマンド内で、最初のコマンドである必要があります。

最初から、このイメージは仮想概念であり、実際には存在しません。空白のイメージを表します。次の命令がイメージの最初のレイヤーとして存在し始めます。

RUN 実行コマンド

RUN は、コマンドラインコマンドを実行するために使用されます。

シェル形式:

RUN <命令>

RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
## の 2 つの形式があります。 #exec 形式:

RUN ["可执行文件", "参数1", "参数2"]
Union FS には最大レイヤ数に制限があります。たとえば、AUFS の最大レイヤ数は以前は 42 でしたが、現在は 127 レイヤを超えることはできません。同じ関数の場合、 && は、必要なコマンドを連結するために使用する必要があります。画像レイヤーの数を簡略化する

COPY ファイルをコピー

COPY [--chown=<user>:<group>] <宿主机源路径> <镜像内的目标路径>
COPY [--chown=<user>:<group>] ["<宿主机源路径1>",... "<镜像内的目标路径>"]
# 把当前目录的a.txt文件复制到镜像的根目录
COPY a.txt /a.txt

ADD ファイルをコピーする (ダウンロード ファイルまたは解凍ファイル) )

ADD [--chown=<user>:<group>] http://xxx <目标路径>       # 下载文件到镜像的目标路径
ADD [--chown=<user>:<group>] ./a.tar.gz <目标路径>       # 复制压缩包,并自动解压到目标路径

CMD は、コンテナーのメイン プロセスのデフォルトの起動コマンドを指定します

CMD ["可执行文件", "参数1", "参数2"...]
# 指定进入容器马上指定 cat /a.txt

CMD ["sh","-c", "cat /a.txt"]
docker run -it イメージを実行するときに、 /bin/bash と同様のコマンド、sh -c cat は /a.txt で自動的に実行されます。それ以外の場合は、コンテナーのメイン プロセスの起動コマンドがユーザー指定の CMD

ENTRYPOINT に従って指定されます。 、CMD に似ています

形式は CMD と一貫していますが、相違点は次のとおりです

1. ENTRYPOINT を使用してパラメータを渡します

Specify ENTRYPOINT [ "curl", " Dockerfile 内の -s", "http://myip.ipip.net" ]、コマンド ラインは docker run を使用します。myip -i の場合、-i パラメーターは ENTRYPOINT コマンドに渡されます。最後に # を入力するときは、 ## コンテナー、コンテナーは、curl -s http://myip.ipip.net -i


2. CMD とは関係がなく、コンテナー CMD とも関係のない初期化作業を実行します。 CMD が何であっても、事前に前処理作業を行う必要があります。

ENTRYPOINT ["docker-entrypoint.sh"] に似ています。このスクリプトは、ユーザーの ID が正当であるかどうかなどをチェックします。

ENV は環境変数を設定します

ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...

ARG ビルド パラメーター

ARG <参数名>[=<默认值>]
ARG 命令には有効な範囲があります。FROM 命令の前に指定した場合、FROM 命令でのみ使用できます。

ARG DOCKER_USERNAME=library

FROM ${DOCKER_USERNAME}/alpine

FROM の後に指定した場合、各ステージで使用される変数は各ステージで個別に指定する必要があります

FROM ${DOCKER_USERNAME}/alpine

# 在FROM 之后使用变量,必须在每个阶段分别指定
ARG DOCKER_USERNAME=library

RUN set -x ; echo ${DOCKER_USERNAME}

VOLUME anonymous volume

VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>
順番にユーザーが実行時に動的ファイルがボリュームとして保存されるディレクトリをマウントし忘れることを防ぐために、Dockerfile で特定のディレクトリを匿名ボリュームとしてマウントするように事前に指定できるため、ユーザーが実行時にマウントを指定しない場合でも、 , アプリケーションはまた、通常の操作中、大量のデータがコンテナー ストレージ レイヤーに書き込まれることはありません。

ここの /data ディレクトリは、コンテナーの実行中に匿名ボリュームとして自動的にマウントされます。 /data に書き込まれた情報はコンテナ ストレージ層には記録されないため、コンテナ ストレージ層のステートレス性が確保されます。

EXPOSE 公開ポート

EXPOSE <端口1> [<端口2>...]
EXPOSE 命令は、コンテナが実行中にサービスを提供するポートを宣言します。EXPOSE は、コンテナが使用するポートを宣言するだけです。ホストはポート マッピングを自動的に実行しません。

このようなステートメントを Dockerfile に記述することには 2 つの利点があります。1 つは、イメージ ユーザーがイメージ サービスのガード ポートを理解し、構成マッピングを容易にすることです。

もう 1 つは、ランダム ポートを使用する場合です。実行時のマッピング、つまり docker run -P が使用される場合、EXPOSE ポートは自動的かつランダムにマッピングされます。

EXPOSE と実行時の -p : の使用を区別するため。

-p はホスト ポートとコンテナ ポートをマッピングするもので、言い換えれば、コンテナの対応するポート サービスを外部に公開します。

WORKDIR は作業ディレクトリを指定します。ディレクトリが存在しない場合、WORKDIR はディレクトリを作成します

WORKDIR <工作目录路径>
例 1:

WORKDIR /app

RUN echo "hello" > world.txt

例 2:

WORKDIR /a
WORKDIR b
WORKDIR c

RUN pwd

## RUN pwd 的工作目录为 /a/b/c

USER 現在のユーザーを指定します

USER <用户名>[:<用户组>]
実行中に root として実行されるスクリプトの ID を変更する場合 (サービスを実行する場合など)すでに確立されているユーザープロセスとして、su や sudo を使用しないでください。これらはより面倒な設定を必要とし、TTY が欠落している環境ではエラーが発生することがよくあります。呉須を使うのがおすすめです。

# 建立 redis 用户,并使用 gosu 换另一个用户执行命令
RUN groupadd -r redis && useradd -r -g redis redis

# 下载 gosu
RUN wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/1.12/gosu-amd64" \
    && chmod +x /usr/local/bin/gosu \
    && gosu nobody true
    
# 设置 CMD,并切换到redis用户执行
CMD [ "exec", "gosu", "redis", "redis-server" ]

HEALTHCHECK は、コンテナーのステータスが正常かどうかを判断する方法を Docker に指示します

HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
オプション:

--interval=<间隔>:两次健康检查的间隔,默认为 30 秒;
--timeout=<时长>:健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒;
--retries=<次数>:当连续失败指定次数后,则将容器状态视为 unhealthy,默认 3 次

HEALTHCHECK 命令が指定されている場合画像を使用してコンテナを起動します。初期状態で起動します。HEALTHCHECK 命令のチェックが成功すると健全になります。一定回数連続で失敗すると異常になります。

HEALTHCHECK は 1 回のみ指定できます。複数記述した場合は、最後のもののみが有効になります

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视频教程

以上がDockerFile コマンドを詳しく理解します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。