Dockerノート(2):Dockerfile

4505 ワード

Dockerfileは、ベースミラーに適用され、最終的に新しいミラーを作成する一連のコマンドとパラメータからなるスクリプトです.

一般的なオプション


例:
FROM node:latest
MAINTAINER my_name
ADD ./my_project /code
VOLUME ["/data1", "/data2"]
WORKDIR /code
RUN apt-get install mysql
EXPOSE 6777
ENV SRC_URL www.xxxxxxxxxxx.com/xxxxxxx
RUN wget $SRC_URL
CMD ["node","bin/www"]
  • FROM:ベースミラーを指定します.ローカルにベースミラーが存在しない場合は、リモートウェアハウスから自動的に引き出します.FROMは、Dockerfileのコメント以外の最初の行の文でなければなりません.
  • MAINTAINER:ミラーの構築者を指定し、ピットを発見したときに
  • を探すことができます.
  • ADD:自機のファイルまたはディレクトリをミラーのあるディレクトリにコピーし、後続の構築コマンドおよびコンテナ実行中にコンテナでそのディレクトリ
  • にアクセスすることができる.
  • WORKDIR:後続の構築コマンドの動作経路を指定する
  • RUN:関連する依存ライブラリ
  • をインストールするなど、ミラー内でコマンドを実行する.
  • CMD:ミラー実行時の最初のコマンドを指定します.CMDは一度しか現れず、何度も現れた場合、前のものは
  • で覆われる.
        CMD ["executable","param1","param2"]   exec  , ;
    
        CMD command param1 param2   /bin/sh  , ;
    
        CMD ["param1","param2"]   ENTRYPOINT  ;
  • EXPOSE:コンテナのポートを露出し、他のコンテナは、同じネットワークにおいて6777ポート
  • が露出することを前提として、このコンテナが提供するサービスにアクセスすることができる.
  • ENV:環境変数を設定します.これらの環境変数は、後続の構築コマンドで使用することもできるし、コンテナを実行するときに、これらの変数
  • をコンテナで使用することもできる.
  • COPY:ネイティブのファイルまたはディレクトリをミラーのディレクトリの下にコピーし、その後の構築コマンドとコンテナ実行でコンテナにアクセスできます.このコマンドはADDとして機能するが、ADDはより強力であり、例えば、圧縮パケットをコピーすると、ADDは自動的に
  • を解凍する.
  • ENTRYPOINT:コンテナ起動後に実行されるコマンド.各Dockerfileには1つのENTRYPOINTしかありません.複数を指定すると、最後の1つだけ有効になります.(CMD命令で指定されたコンテナ起動時にコマンドはdocker runで指定されたコマンドで上書きできますが、ENTRYPOINT命令で指定されたコマンドは上書きできません.docker runで指定されたパラメータをENTRYPOINT指定コマンドのパラメータとします.)
  •     ENTRYPOINT ["executable", "param1", "param2"]
    
        ENTRYPOINT command param1 param2(shell )
  • VOLUME:コンテナボリュームは1つ以上のコンテナで使用できる特殊なディレクトリです.UFSを迂回してホストディレクトリをコンテナに掛け、多くの有用な特性を提供します.
  • データボリュームは、
  • をコンテナ間で共有および再利用することができる.
  • データボリュームの修正は、すぐに有効になります.
  • データボリュームの更新は、ミラー
  • に影響しません.
  • データボリュームのデフォルトは、コンテナが削除されても-vオプション:docker rm-v container_を使用しない限り、コンテナは削除されません.id/container_name
  • 注意:データボリュームの使用は、Linuxの下でディレクトリまたはファイルをmountするのと同様に、ミラー内のマウントポイントとして指定されたディレクトリ内のファイルが非表示になり、マウントされたデータボリュームが表示されます.コンテナディレクトリdirにはtempというファイルがありますData、dirにデータボリューム
  • をマウントした場合
  • Dockerfileでは、ホスト上の対応ディレクトリ
  • を指定できません.

    ああ、ではtempを二度と読めません.データボリュームを削除しない限り、data.

    その他のオプション


    USER


    書式:
     USER 

    USER命令はWORKDIRと類似しており,いずれも環境状態を変化させ,以降の層に影響を及ぼす.WORKDIRは作業ディレクトリを変更し,USERは後層のRUN,CMD,ENTRYPOINTのような命令を実行するアイデンティティを変更する.
    もちろん、WORKDIRと同じように、USERは指定したユーザーに切り替えるのを助けるだけで、このユーザーは事前に確立されていなければなりません.そうしないと切り替えられません.
    RUN groupadd -r redis && useradd -r -g redis redis
    USER redis
    RUN [ "redis-server" ]

    rootで実行されるスクリプトの場合、実行中にアイデンティティを変更したい場合、たとえば確立されたユーザーでサービスプロセスを実行したい場合、suまたはsudoを使用しないでください.これらは面倒な構成が必要で、TTYが欠けている環境でよくエラーが発生します.gosuをお勧めします.
    #   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.7/
    gosu-amd64" \
    && chmod +x /usr/local/bin/gosu \
    && gosu nobody true
    #   CMD, 
    CMD [ "exec", "gosu", "redis", "redis-server" ]

    ONBUILD


    フォーマット:ONBUILD.
    ONBUILDは、RUN、COPYなどの他の命令に続く特殊な命令であり、これらの命令は、現在のミラー構築時には実行されません.現在のミラーをベースとして、次のレベルのミラーを構築する場合にのみ実行されます.
    Dockerfileの他のコマンドは、現在のミラーをカスタマイズするために用意されていますが、ONBUILDだけが他人のカスタマイズを助けるために用意されています.
    fundamental/Dockerfile
    FROM node:slim
    RUN mkdir /app
    WORKDIR /app
    ONBUILD COPY ./package.json /app
    ONBUILD RUN [ "npm", "install" ]
    ONBUILD COPY . /app/
    CMD [ "npm", "start" ]

    project1/Dockerfile
    FROM fundamental
    do other thing

    プロジェクト1を構築するときにONBUILDのコマンドが有効になります.


    公式のpythonミラーに基づいて、バックエンドの環境ミラー(redis、flaskなどを含むライブラリ)を構築します.
    FROM python:3.6-alpine
    #  
    ADD the_path_of_project /code   
    #  pwd
    WORKDIR /code
    #  
    RUN pip install redis flask
    #  
    CMD ["python", "app.py"]

    例:
  • FROM:ベースミラーをpython:3.6-alpine
  • に指定
  • ADD:プロジェクトコードはコンテナのcodeディレクトリの下
  • にコピーされる.
  • WORKDIR:後続コマンドを指定するpwdはcode
  • である.
  • RUN:依存ライブラリ
  • をインストールする
  • CMD:コンテナを起動するときに実行するコマンドを指定します.すなわち、プロジェクト
  • を起動します.

    リファレンス

  • docker pratice
  • 前節:Dockerノート(1):紹介、ミラー、コンテナおよびその基本操作
  • 次節:Dockerノート(3):docker-compose