Dockerfileの書く規則と命令の使用方法
8169 ワード
Dockerfileの命令は大文字と小文字を無視し、大文字を使用することをお勧めします.注釈として#を使用します.各行は1つの命令しかサポートされていません.各命令は複数のパラメータを運ぶことができます.
Dockerfileの命令は役割によって2種類に分けられ,構築命令と設定命令である.構築命令はimageを構築するために使用され、指定された操作はimageを実行するコンテナでは実行されません.設定コマンドはimageのプロパティを設定するために使用され、指定された操作はimageを実行するコンテナで実行されます.
FROM(ベースイメージ指定)
ビルド命令は、Dockerfileの他の命令の前に指定する必要があります.後続の命令は、その命令によって指定されたimageに依存する.FROM命令で指定されたベースイメージは、公式リモートウェアハウスであってもよいし、ローカルウェアハウスであってもよい.
このコマンドには2つのフォーマットがあります.
ベースイメージがそのイメージの最後に変更されたバージョンを指定します.または、
ベースイメージがそのイメージのtagバージョンであることを指定します.
MAINTAINER(ミラー作成者情報を指定するために使用)
イメージの作成者に関する情報をイメージに書き込むための構築命令.このイメージに対してdocker inspectコマンドを実行すると、出力には対応するフィールドが記録されます.
書式:
RUN(ソフトウェアインストール用)
構築命令、RUNは基礎imageでサポートされている任意の命令を実行することができる.ベースイメージがubuntuを選択した場合、ソフトウェア管理セクションではubuntuのコマンドしか使用できません.このコマンドには2つのフォーマットがあります.
CMD(container起動時に実行する操作を設定)
container起動時に指定した操作に使用するコマンドを設定します.この操作は、カスタムスクリプトを実行するか、システムコマンドを実行するかのいずれかです.このコマンドはファイルに1回のみ存在し、複数ある場合は最後の1つのみ実行されます.このコマンドには、次の3つのフォーマットがあります.
DockerfileがENTRYPOINTを指定した場合、次の形式が使用されます.
ENTRYPOINTは、param 1とparam 2をパラメータとして実行する実行可能なスクリプトまたはプログラムのパスを指定します.したがって、CMD命令が上記の形式を使用する場合、DockerfileにはENTRYPOINTがセットされている必要があります.
ENTRYPOINT(container起動時に実行する操作を設定)
コマンドを設定し、コンテナの起動時に実行するコマンドを指定します.複数回設定できますが、最後のコマンドのみ有効です.2つのフォーマット:
この命令の使用は2つのケースに分けられ,1つは単独で使用し,もう1つはCMD命令と組み合わせて使用する.単独で使用する場合、CMDコマンドを使用し、CMDが完全に実行可能なコマンドである場合、CMDコマンドとENTRYPOINTは互いに上書きされ、最後のCMDまたはENTRYPOINTだけが有効になります.
もう1つの使用法は、ENTRYPOINTのデフォルトパラメータを指定するためにCMD命令と組み合わせて使用され、この場合、CMD命令は完全な実行可能な命令ではなく、パラメータ部分にすぎない.ENTRYPOINT命令はJSON方式でのみ実行命令を指定でき、パラメータは指定できません.
USER(containerコンテナを設置するユーザ)
コマンドを設定し、コンテナを起動するユーザーを設定します.デフォルトはrootユーザーです.
EXPOSE(コンテナをホストマシンにマッピングする必要があるポートを指定)
コンテナ内のポートをホストマシン内のポートにマッピングするコマンドを設定します.コンテナにアクセスする必要がある場合は、コンテナのIPアドレスではなく、ホストマシンのIPアドレスとマッピングされたポートを使用することができます.操作全体を完了するには、まずDockerfileでEXPOSEを使用してマッピングするコンテナポートを設定し、コンテナを実行するときに-pオプションとEXPOSE設定のポートを指定します.これにより、EXPOSE設定のポート番号がホストマシンのポート番号にランダムにマッピングされます.ホストマシンにマッピングする必要があるポートを指定して、ホストマシンのポート番号が使用されていないことを確認することもできます.EXPOSE命令では、一度に複数のポート番号を設定することができ、対応するコンテナを運転する際には、-pオプションを複数回使用することができます.書式:
ポートマッピングはdockerの重要な機能であり、コンテナを実行するたびにコンテナのIPアドレスが指定できず、ブリッジカードのアドレス範囲内でランダムに生成されるためです.ホストマシンのIPアドレスは固定されており、コンテナのポートをホストマシンのポートにマッピングし、コンテナ内のサービスにアクセスするたびにコンテナのIPのアドレスを表示しないようにすることができます.実行中のコンテナの場合、docker portとコンテナにマッピングする必要があるポートとコンテナのIDを追加して、ホストマシン上のポート番号のマッピングポートを表示できます.
EnV(環境変数の設定用)
環境変数をimageに設定するコマンドを構築します.書式:
設定後、後続のRUNコマンドを使用できます.containerが起動したら、docker inspectでこの環境変数を表示するか、docker run--env key=valueで環境変数を設定または変更できます.JAVAプログラムをインストールした場合、JAVAを設定する必要があります.HOME、それではDockerfileで「ENV JAVA」と書くことができます.HOME/path/to/java/dirent
ADD(srcからcontainerへのdestパス)
containerにコピーされたすべてのファイルとフォルダ権限は0755、uidとgidは0です.ディレクトリの場合、ディレクトリを含まないディレクトリの下にあるすべてのファイルがcontainerに追加されます.ファイルが認識可能な圧縮フォーマットである場合、dockerは解凍を手伝います(圧縮フォーマットに注意してください).
書式:
VOLUME(マウントポイント指定)
コンテナ内の1つのディレクトリにデータを永続化して格納する機能を持たせるコマンドを設定します.このディレクトリはコンテナ自体で使用するか、他のコンテナに共有して使用することができます.コンテナがAFSを使用していることを知っています.このファイルシステムはデータを永続化できません.コンテナが閉じると、すべての変更が失われます.この命令は、コンテナ内のアプリケーションがデータを永続化する必要がある場合にDockerfileで使用することができる.書式:
このDockerfileでimageを生成するコンテナを実行し、/tmp/dataディレクトリのデータはコンテナが閉じた後も、中のデータは存在します.たとえば、別のコンテナでもデータを永続化する必要があり、上のコンテナで共有されている/tmp/dataディレクトリを使用する場合は、次のコマンドを実行してコンテナを起動できます.
container 1は1番目のコンテナのIDであり、image 2は2番目のコンテナがimageを実行する名前である.
WORKDIR(切り替えディレクトリ)
コマンドを設定すると、複数回切り替えることができ(cdコマンドに相当)、RUN、CMD、ENTRYPOINTに対して有効になります.書式:
ONBUILD(サブミラーで実行)
ONBUILDで指定したコマンドは、ミラーの構築時には実行されず、そのサブミラーで実行されます.詳細は参照可能https://www.dockboard.org/docker-quicktip-3-onbuild
Dockerfileを作成し、jdk+tomcat環境を構築
Dockerfileファイル
tomcat7.sh
著者はこれらのファイルをGithubにアップロードしましたhttps://github.com/agileshell/dockerfile-jdk-tomcat.git
ミラーの構築
スクリプトが作成されました.ミラーに変換する必要があります.
Dockerfileの命令は役割によって2種類に分けられ,構築命令と設定命令である.構築命令はimageを構築するために使用され、指定された操作はimageを実行するコンテナでは実行されません.設定コマンドはimageのプロパティを設定するために使用され、指定された操作はimageを実行するコンテナで実行されます.
FROM(ベースイメージ指定)
ビルド命令は、Dockerfileの他の命令の前に指定する必要があります.後続の命令は、その命令によって指定されたimageに依存する.FROM命令で指定されたベースイメージは、公式リモートウェアハウスであってもよいし、ローカルウェアハウスであってもよい.
このコマンドには2つのフォーマットがあります.
FROM
ベースイメージがそのイメージの最後に変更されたバージョンを指定します.または、
FROM :
ベースイメージがそのイメージのtagバージョンであることを指定します.
MAINTAINER(ミラー作成者情報を指定するために使用)
イメージの作成者に関する情報をイメージに書き込むための構築命令.このイメージに対してdocker inspectコマンドを実行すると、出力には対応するフィールドが記録されます.
書式:
MAINTAINER
RUN(ソフトウェアインストール用)
構築命令、RUNは基礎imageでサポートされている任意の命令を実行することができる.ベースイメージがubuntuを選択した場合、ソフトウェア管理セクションではubuntuのコマンドしか使用できません.このコマンドには2つのフォーマットがあります.
RUN (the command is run in a shell - `/bin/sh -c`)
RUN ["executable", "param1", "param2" ... ] (exec form)
CMD(container起動時に実行する操作を設定)
container起動時に指定した操作に使用するコマンドを設定します.この操作は、カスタムスクリプトを実行するか、システムコマンドを実行するかのいずれかです.このコマンドはファイルに1回のみ存在し、複数ある場合は最後の1つのみ実行されます.このコマンドには、次の3つのフォーマットがあります.
CMD ["executable","param1","param2"] (like an exec, this is the preferred form)
CMD command param1 param2 (as a shell)
DockerfileがENTRYPOINTを指定した場合、次の形式が使用されます.
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
ENTRYPOINTは、param 1とparam 2をパラメータとして実行する実行可能なスクリプトまたはプログラムのパスを指定します.したがって、CMD命令が上記の形式を使用する場合、DockerfileにはENTRYPOINTがセットされている必要があります.
ENTRYPOINT(container起動時に実行する操作を設定)
コマンドを設定し、コンテナの起動時に実行するコマンドを指定します.複数回設定できますが、最後のコマンドのみ有効です.2つのフォーマット:
ENTRYPOINT ["executable", "param1", "param2"] (like an exec, the preferred form)
ENTRYPOINT command param1 param2 (as a shell)
この命令の使用は2つのケースに分けられ,1つは単独で使用し,もう1つはCMD命令と組み合わせて使用する.単独で使用する場合、CMDコマンドを使用し、CMDが完全に実行可能なコマンドである場合、CMDコマンドとENTRYPOINTは互いに上書きされ、最後のCMDまたはENTRYPOINTだけが有効になります.
# CMD , ENTRYPOINT
CMD echo “Hello, World!”
ENTRYPOINT ls -l
もう1つの使用法は、ENTRYPOINTのデフォルトパラメータを指定するためにCMD命令と組み合わせて使用され、この場合、CMD命令は完全な実行可能な命令ではなく、パラメータ部分にすぎない.ENTRYPOINT命令はJSON方式でのみ実行命令を指定でき、パラメータは指定できません.
FROM ubuntu
CMD ["-l"]
ENTRYPOINT ["/usr/bin/ls"]
USER(containerコンテナを設置するユーザ)
コマンドを設定し、コンテナを起動するユーザーを設定します.デフォルトはrootユーザーです.
# memcached
ENTRYPOINT ["memcached"]
USER daemon
ENTRYPOINT ["memcached", "-u", "daemon"]
EXPOSE(コンテナをホストマシンにマッピングする必要があるポートを指定)
コンテナ内のポートをホストマシン内のポートにマッピングするコマンドを設定します.コンテナにアクセスする必要がある場合は、コンテナのIPアドレスではなく、ホストマシンのIPアドレスとマッピングされたポートを使用することができます.操作全体を完了するには、まずDockerfileでEXPOSEを使用してマッピングするコンテナポートを設定し、コンテナを実行するときに-pオプションとEXPOSE設定のポートを指定します.これにより、EXPOSE設定のポート番号がホストマシンのポート番号にランダムにマッピングされます.ホストマシンにマッピングする必要があるポートを指定して、ホストマシンのポート番号が使用されていないことを確認することもできます.EXPOSE命令では、一度に複数のポート番号を設定することができ、対応するコンテナを運転する際には、-pオプションを複数回使用することができます.書式:
EXPOSE [...]
#
EXPOSE port1
#
docker run -p port1 image
#
EXPOSE port1 port2 port3
#
docker run -p port1 -p port2 -p port3 image
#
docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image
ポートマッピングはdockerの重要な機能であり、コンテナを実行するたびにコンテナのIPアドレスが指定できず、ブリッジカードのアドレス範囲内でランダムに生成されるためです.ホストマシンのIPアドレスは固定されており、コンテナのポートをホストマシンのポートにマッピングし、コンテナ内のサービスにアクセスするたびにコンテナのIPのアドレスを表示しないようにすることができます.実行中のコンテナの場合、docker portとコンテナにマッピングする必要があるポートとコンテナのIDを追加して、ホストマシン上のポート番号のマッピングポートを表示できます.
EnV(環境変数の設定用)
環境変数をimageに設定するコマンドを構築します.書式:
ENV
設定後、後続のRUNコマンドを使用できます.containerが起動したら、docker inspectでこの環境変数を表示するか、docker run--env key=valueで環境変数を設定または変更できます.JAVAプログラムをインストールした場合、JAVAを設定する必要があります.HOME、それではDockerfileで「ENV JAVA」と書くことができます.HOME/path/to/java/dirent
ADD(srcからcontainerへのdestパス)
containerにコピーされたすべてのファイルとフォルダ権限は0755、uidとgidは0です.ディレクトリの場合、ディレクトリを含まないディレクトリの下にあるすべてのファイルがcontainerに追加されます.ファイルが認識可能な圧縮フォーマットである場合、dockerは解凍を手伝います(圧縮フォーマットに注意してください).
がファイルであり、
にスラッシュを使用して終了しない場合、
はファイルとみなされ、
の内容は
に書き込まれる.
がファイルであり、
でスラッシュで終了した場合、
ファイルは
ディレクトリにコピーされます.書式:
ADD
は、構築されたソースディレクトリに対する相対パスであり、ファイルまたはディレクトリのパスであってもよいし、リモートのファイルurlであってもよい.
はcontainerの絶対パスですVOLUME(マウントポイント指定)
コンテナ内の1つのディレクトリにデータを永続化して格納する機能を持たせるコマンドを設定します.このディレクトリはコンテナ自体で使用するか、他のコンテナに共有して使用することができます.コンテナがAFSを使用していることを知っています.このファイルシステムはデータを永続化できません.コンテナが閉じると、すべての変更が失われます.この命令は、コンテナ内のアプリケーションがデータを永続化する必要がある場合にDockerfileで使用することができる.書式:
VOLUME [""]
FROM base
VOLUME ["/tmp/data"]
このDockerfileでimageを生成するコンテナを実行し、/tmp/dataディレクトリのデータはコンテナが閉じた後も、中のデータは存在します.たとえば、別のコンテナでもデータを永続化する必要があり、上のコンテナで共有されている/tmp/dataディレクトリを使用する場合は、次のコマンドを実行してコンテナを起動できます.
docker run -t -i -rm -volumes-from container1 image2 bash
container 1は1番目のコンテナのIDであり、image 2は2番目のコンテナがimageを実行する名前である.
WORKDIR(切り替えディレクトリ)
コマンドを設定すると、複数回切り替えることができ(cdコマンドに相当)、RUN、CMD、ENTRYPOINTに対して有効になります.書式:
WORKDIR /path/to/workdir
# /p1/p2 vim a.txt
WORKDIR /p1 WORKDIR p2 RUN vim a.txt
ONBUILD(サブミラーで実行)
ONBUILD
ONBUILDで指定したコマンドは、ミラーの構築時には実行されず、そのサブミラーで実行されます.詳細は参照可能https://www.dockboard.org/docker-quicktip-3-onbuild
Dockerfileを作成し、jdk+tomcat環境を構築
Dockerfileファイル
# Pull base image
FROM ubuntu:13.10
MAINTAINER zing wang "[email protected]"
# update source
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe"> /etc/apt/sources.list
RUN apt-get update
# Install curl
RUN apt-get -y install curl
# Install JDK 7
RUN cd /tmp && curl -L 'http://download.oracle.com/otn-pub/java/jdk/7u65-b17/jdk-7u65-linux-x64.tar.gz' -H 'Cookie: oraclelicense=accept-securebackup-cookie; gpw_e24=Dockerfile' | tar -xz
RUN mkdir -p /usr/lib/jvm
RUN mv /tmp/jdk1.7.0_65/ /usr/lib/jvm/java-7-oracle/
# Set Oracle JDK 7 as default Java
RUN update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-7-oracle/bin/java 300
RUN update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-7-oracle/bin/javac 300
ENV JAVA_HOME /usr/lib/jvm/java-7-oracle/
# Install tomcat7
RUN cd /tmp && curl -L 'http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.8/bin/apache-tomcat-7.0.8.tar.gz' | tar -xz
RUN mv /tmp/apache-tomcat-7.0.8/ /opt/tomcat7/
ENV CATALINA_HOME /opt/tomcat7
ENV PATH $PATH:$CATALINA_HOME/bin
ADD tomcat7.sh /etc/init.d/tomcat7
RUN chmod 755 /etc/init.d/tomcat7
# Expose ports.
EXPOSE 8080
# Define default command.
ENTRYPOINT service tomcat7 start && tail -f /opt/tomcat7/logs/catalina.out
tomcat7.sh
export JAVA_HOME=/usr/lib/jvm/java-7-oracle/
export TOMCAT_HOME=/opt/tomcat7
case $1 in
start)
sh $TOMCAT_HOME/bin/startup.sh
;;
stop)
sh $TOMCAT_HOME/bin/shutdown.sh
;;
restart)
sh $TOMCAT_HOME/bin/shutdown.sh
sh $TOMCAT_HOME/bin/startup.sh
;;
esac
exit 0
著者はこれらのファイルをGithubにアップロードしましたhttps://github.com/agileshell/dockerfile-jdk-tomcat.git
ミラーの構築
スクリプトが作成されました.ミラーに変換する必要があります.
docker build -t zingdocker/jdk-tomcat .
docker run -d -p 8090:8080 zingdocker/jdk-tomcat