Dockerfile命令の詳細

6802 ワード

FROM FROMコマンドは、ベースミラーを指定します.ミラーを構築するときは、ベースミラーを指定する必要があります.したがって、DockerfileのうちFROMは必須命令であり、最初の命令である必要があります.
Docker Hubにはよく使われる高品質の公式ミラーが多く、nginx、mysql、redisなどのアプリケーションやサービスクラスのミラーがあります.Openjdk、python、nodeなど、さまざまな言語アプリケーションを実行するためのミラーもあります.
アプリケーションの公式ミラーが見つからない場合は、オペレーティングシステムミラーに基づいて構築できます.Docker Hubには多くのOSミラーが用意されています.
FROM ubuntu
...

RUN RUN命令は、コマンドライン命令を実行するために使用される.RUN命令のフォーマットは2種類あります.
  • shell形式:RUN 、コマンドラインにコマンドを直接入力するようにします.
    RUN java -jar app.jar
  • exec形式: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つの形式があります.
  • shell形式:CMD
    CMD echo 'Hello, world!''
  • exec形式:CMD [" ", " 1", " 2", ...]
    CMD [ "sh", "-c", "echo 'Hello, world!'" ]
  • もう1つのパラメータリストフォーマット: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は、RUNCMD、および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が実行される.