Dockerfile命令の詳細
6802 ワード
FROM
Docker Hubにはよく使われる高品質の公式ミラーが多く、nginx、mysql、redisなどのアプリケーションやサービスクラスのミラーがあります.Openjdk、python、nodeなど、さまざまな言語アプリケーションを実行するためのミラーもあります.
アプリケーションの公式ミラーが見つからない場合は、オペレーティングシステムミラーに基づいて構築できます.Docker Hubには多くのOSミラーが用意されています.
RUN shell形式: exec形式:
複数のコマンドについて、次のような書き方を使用できます.
複数のコマンドについては、
COPY
複数のパスパラメータの場合、最後のパスはターゲットパスであり、その他はソースパスです.
CMD shell形式: exec形式: もう1つのパラメータリストフォーマット:
以上のコマンドはapp.JArはバックグラウンドで動作し、コンテナが起動するとすぐに終了します.Dockerコンテナはデーモンスレッドに似ており、すべてのフロントプログラムが終了するとコンテナが終了します.
以上のコマンドは、コンテナを実行するときに、ミラーの起動コマンドを
ENTRYPOINT
つまり、
以上の
ENV
環境変数は、後の他の命令で
ARG
フォーマット:
以上の
VOLUME
データベース・クラスがデータを保持する必要があるアプリケーションの場合、そのファイルはボリュームに保存され、
ここで、
以上のコマンドは、
EXPOSE
以上の
WORKDIR
以上の操作の2行目の作業ディレクトリは
USER
ONBUILD
この
以前に構築されたミラー名がmy-jreであると仮定し、以上の
FROM
コマンドは、ベースミラーを指定します.ミラーを構築するときは、ベースミラーを指定する必要があります.したがって、Dockerfile
のうちFROM
は必須命令であり、最初の命令である必要があります.Docker Hubにはよく使われる高品質の公式ミラーが多く、nginx、mysql、redisなどのアプリケーションやサービスクラスのミラーがあります.Openjdk、python、nodeなど、さまざまな言語アプリケーションを実行するためのミラーもあります.
アプリケーションの公式ミラーが見つからない場合は、オペレーティングシステムミラーに基づいて構築できます.Docker Hubには多くのOSミラーが用意されています.
FROM ubuntu
...
RUN
RUN
命令は、コマンドライン命令を実行するために使用される.RUN
命令のフォーマットは2種類あります.RUN
、コマンドラインにコマンドを直接入力するようにします.RUN java -jar app.jar
RUN [" ", " 1", " 2"]
.RUN ["java", "-jar", "app.jar"]
Dockerfile
では、各命令はミラー上にレイヤを確立するので、複数の命令ラインについては、RUN
命令を複数書かないでください.複数のコマンドについて、次のような書き方を使用できます.
FROM ubuntu
RUN apt-get update \
&& apt-get install -y redis
複数のコマンドについては、
&&
を使用して接続され、1つのRUN
コマンドだけで実行され、1つのレイヤのみが構築されます.COPY
COPY
命令は、ホストのファイルディレクトリをミラーにコピーするために使用される.次の2つの形式があります.COPY [--chown=:] ...
COPY app.jar /usr/src/
COPY [--chown=:] [" 1", ... " "]
COPY ["app.jar", "config.yml", "/usr/src"]
複数のパスパラメータの場合、最後のパスはターゲットパスであり、その他はソースパスです.
は、絶対パスであってもよいし、作業ディレクトリに対するパスであってもよい(作業ディレクトリはWORKDIR
で指定できる).ターゲットパスが存在しない場合は、ファイルをコピーする前に作成されます.CMD
CMD
は、コンテナ起動コマンドであり、コンテナ起動後に実行するプログラムを指定します.RUN
命令と同様に2つの形式があります.CMD
CMD echo 'Hello, world!''
CMD [" ", " 1", " 2", ...]
CMD [ "sh", "-c", "echo 'Hello, world!'" ]
CMD [" 1", " 2", ...]
.ENTRYPOINT
命令が指定された後、CMD
でパラメータを指定できます.CMD
を使用する場合、プログラムは以前に実行する必要があります.Dockerは仮想マシンではなく、コンテナにはバックグラウンドサービスの概念がありません.CMD
を使用してバックグラウンドプログラムを実行すると、コンテナはコマンドの実行が完了すると終了します.CMD java -jar app.jar &
以上のコマンドはapp.JArはバックグラウンドで動作し、コンテナが起動するとすぐに終了します.Dockerコンテナはデーモンスレッドに似ており、すべてのフロントプログラムが終了するとコンテナが終了します.
CMD
で指定されたコマンドは、実行時に置き換えることができ、ミラー名の後に続くパラメータは、ミラー内のCMD
を置き換えることができます.docker run app echo $HOME
以上のコマンドは、コンテナを実行するときに、ミラーの起動コマンドを
echo $HOME
に置き換えます.ENTRYPOINT
ENTRYPOINT
のフォーマットはCMD
と同様に2つのフォーマットがあります.CMD
と同様にコンテナ起動を指定するプログラムとパラメータですが、少し違います.ENTRYPOINT
が指定されると、CMD
の内容はパラメータとしてENTRYPOINT
の後に追加される.つまり、
""
ENTRYPOINT
は、コマンドのようにミラーを使用することができ、CMD
のみを使用すると、run
コマンドのミラー名の後ろのパラメータがCMD
の内容を置き換えます.ENTRYPOINT
を使用すると、これらのパラメータは元のコマンドの後に付加されます.FROM alpine
ENTRYPOINT [ "ls" ]
以上の
Dockerfile
で構築されたミラーを使用してコンテナを実行します.docker run app -al
-al
パラメータは、ENTRYPOINT
によって指定されたコマンドの後に付加され、コンテナが起動するとls -al
が実行される.ENV
ENV
命令は環境変数を設定するために使用され、フォーマットは2つあります.ENV
ENV = =
環境変数は、後の他の命令で
$key
によって使用することができる.FROM ubuntu
ENV VERSION="8-jre"
RUN apt-get update \
&& apt-get install -y openjdk-$VERSION
...
ARG
ARG
命令は構築パラメータを指定し、ENV
効果と同様に環境変数を設定します.異なる点は、ARG
に設定された構築パラメータであり、コンテナ運転時には存在しない.フォーマット:
ARG [=]
、デフォルト値を指定することも、指定しないこともできます.FROM alpine
ARG NAME="Hello, Docker!"
RUN echo $NAME
CMD echo $NAME
以上の
Dockerfile
については、構築時に出力が見られるが、コンテナの運転時に出力は見られない.ARG
で設定されたパラメータは、構築コマンドで指定できます:docker build --build-arg =
.VOLUME
VOLUME
命令は、匿名ボリュームを定義するために使用される.VOLUME
VOLUME [" 1", " 2", ...]
データベース・クラスがデータを保持する必要があるアプリケーションの場合、そのファイルはボリュームに保存され、
Dockerfile
で指定したディレクトリを匿名ボリュームにマウントできます.VOLUME /data
ここで、
/data
ディレクトリは、コンテナの実行時に匿名ボリュームとして自動的にマウントされ、/data
に書き込まれたデータはコンテナの記憶層に記録されません.このマウント設定は、実行時に上書きできます.docker run -v dbdir:/data
以上のコマンドは、
dbdir
ディレクトリを/data
にマウントし、Dockerfile
のマウント構成を置き換えます.EXPOSE
EXPOSE
命令は、コンテナの運転時に露出するポートを指定します.フォーマット:EXPOSE [ ...]
.FROM ubuntu
EXPOSE 8080
RUN apt-get update \
&& apt-get install -y tomcat8
...
以上の
Dockerfile
にはtomcatアプリケーションがインストールされており、コンテナを実行すると8080ポートが露出します.EXPOSE
は、コンテナ露出ポートが指定されているだけで、シンクホストではポートマッピングされません.docker run -P
を使用すると、EXPOSE
で指定されたポートが自動的にランダムにマッピングされます.また、-p
でポート:docker run -p :
を指定することもできます.WORKDIR
WORKDIR
命令作業ディレクトリを指定する、すなわち現在のディレクトリを指定する.cd
命令と同様に、以降各階層の現在のディレクトリはWORKDIR
指定のディレクトリである.ディレクトリが存在しない場合は、自動的に作成されます.フォーマット:WORKDIR
.Dockerfile
をShellスクリプトとして書くことはできません.RUN cd /src/app
RUN java -jar app.jar
以上の操作の2行目の作業ディレクトリは
/src/app
ではなく、2つの命令は同じ階層になく、1番目のRUN
命令のcd
操作は2番目とは何の関係もありません.したがって、ディレクトリを切り替えるには、WORKDIR
を使用して指定する必要があります.USER
USER
命令は、現在のユーザを指定する.WORKDIR
と同様に、以降の層に影響を与える.USER
は、RUN
、CMD
、およびENTRYPOINT
を実行するユーザを変更する.フォーマット:USER [:]
.USER
で指定されたユーザーとグループは、事前に作成されている必要があります.そうしないと、切り替えられません.#
RUN groupadd -r redis \
&& useradd -r -g redis redis
USER redis
ENTRYPOINT ["reids-server"]
ONBUILD
ONBUILD
命令の後には、現在のミラー構築時には実行されず、現在のミラーをベースとしたミラーが次のレベルのミラーを構築した場合にのみ実行される他の命令が続く.フォーマット:ONBUILD
.FROM openjdk:8-jre-alpine
WORKDIR /app
ONBUILD COPY ./app.jar /app
...
この
Dockerfile
は、構築時にONBUILD
を実行しない.FROM my-jre
...
以前に構築されたミラー名がmy-jreであると仮定し、以上の
Dockerfile
がミラーを構築すると、元のONBUILD
が実行される.