1. ホーム
  2. オペレーティングシステム
  3. その他のシステム

DockerfileスクリプトをDockerで使用するための基本ガイド

2022-01-26 05:35:45

Dockerfileは、ベースイメージに適用され、最終的に新しいイメージを作成するためのコマンドとパラメータのセットです。DockerfileはFROMコマンドで始まり、様々なメソッド、コマンド、パラメータが続きます。出力は、コンテナを作成するために使用できる新しいイメージです。

Dockerfileの構文
Dockerfileに飛び込む前に、Dockerfilesの構文とその意味について簡単に説明します。
シンタックスとは何ですか?
ごく簡単に言うと、プログラミングにおいて、文法とは、アプリケーションにプログラムを実行させるためにコマンドを呼び出したり、パラメータを入力する文法的な構造を意味します。これらの文法は、明示的または暗黙的にルールで縛られている。プログラマーは文法仕様に従ってコンピュータと対話する。Dockerfileは、シンプルで明確かつクリーンな構文構造を採用しており、非常に使いやすくなっています。このシンタックスは自明であり、コメントもサポートしています。

Dockerfileの構文例
Dockerfileの構文は、コメントとコマンド+引数の2つの部分から構成されています。
簡単な例です。

コピーコード
コードは以下の通りです。

# Print "Hello docker!"
RUN echo "Hello docker!"

Dockerfileのコマンド
Dockerfileには、イメージを構築するためのコマンドが12種類用意されており、以下に簡単に説明します。

FROMコマンド

コピーコード
コードは以下の通りです。

FROM <image>

または
コピーコード
コードは以下の通りです。

FROM <image>:<tag>

これは、後続のコマンドで使用する基本イメージを設定するものなので、Dockerfile の最初のコマンドとして使用する必要があります。
例えば
コピーコード
コードは以下の通りです。

FROM ubuntu

tagが指定されない場合、デフォルトのタグがlatestとなり、どちらも指定されない場合はエラーとなる。

RUNコマンド
RUNコマンドは、上記のFROMで指定されたイメージの中で任意のコマンドを実行し、その結果をコミットするもので、コミットされたイメージは後で使用されることになります。
フォーマットは2種類。

コピーコード
コードは以下の通りです。

RUN <command> (the command is run in a shell - `/bin/sh -c`)

または:
コピーコード
コードは以下の通りです。

RUN ["executable", "param1", "param2" ... ] (exec form)

RUNコマンドは、:
コピーコード
コードは以下の通りです。

docker run image command
docker commit container_id


備考
コメントとして#を使用
のように。

コピーコード
コードは以下の通りです。

# Memcached
# Memcached
# VERSION 1.0</p> <p># use the ubuntu base image provided by dotCloud
FROM ubuntu</p> <p># make sure the package repository is up to date
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN apt-get update</p> <p># install memcached
RUN apt-get install -y memcached

MAINTAINERコマンド
MAINTAINER <name>
MAINTAINER コマンドは、メンテナの名前と連絡先を指定するために使用します。
など。

コピーコード
コードは以下の通りです。

MAINTAINER Guillaume J. Charmes, [email protected]

ENTRYPOINTコマンド
構文形式は2種類あり、1つは上記(シェル形式)です。

コピーコード
コードは以下の通りです。

ENTRYPOINT cmd param1 param2 ...

2つ目は、exec形式です。
コピーコード
コードは以下の通りです。

ENTRYPOINT ["cmd", "param1", "param2"...]

として。
コピーコード
コードは以下の通りです。

ENTRYPOINT ["echo", "Whale you be my container"]

ENTRYPOINT コマンドは、コンテナの起動時に実行されるコマンドを設定します。
コピーコード
コードは以下の通りです。

root@tankywoo-docker:~# cat Dockerfile
FROM ubuntu
ENTRYPOINT echo "Welcome!"</p> <p>root@tankywoo-docker:~# docker run 62fda5e450d5
Welcome!

USERコマンド
例えば、memcachedが動作しているユーザーを指定するには、上記のENTRYPOINTを使用します。

コピーコード
コードは以下の通りです。

ENTRYPOINT ["memcached", "-u", "daemon"]

もっといい方法があるはずです。
コピーコード
コードは以下の通りです。

ENTRYPOINT ["memcached"]
USER daemon

EXPOSEコマンド
EXPOSE コマンドは、実行中のイメージで公開するポートを設定します。

コピーコード
コードは以下の通りです。

EXPOSE <port> [<port>...]

例えば、memcachedはポート11211を使用していますが、これを公開することで、コンテナの外から見たり通信したりすることができるようになります。
コピーコード
コードは以下の通りです。

EXPOSE 11211

完全な例です。
コピーコード
コードは以下の通りです。

# Memcached
# Memcached
# VERSION 2.2</p> <p># use the ubuntu base image provided by dotCloud
FROM ubuntu</p> <p>MAINTAINER Victor Coisne [email protected]</p> <p># make sure the package repository is up to date
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN apt-get update</p> <p># install memcached
RUN apt-get install -y memcached</p> <p># Launch memcached when launching the container
ENTRYPOINT ["memcached"]</p> <p># run memcached as the daemon user
USER daemon</p> <p># expose memcached port
EXPOSE 11211

上記は公式の例です、国内は163か搜狐のソースに切り替えることをお勧めします、そうでない場合は遅すぎます。
コピーコード
コードは以下の通りです。

root@tankywoo-docker:~# docker build -t tankywoo - < dck [38/480]
Uploading context 2.56 kB
Uploading context
Step 0 : FROM ubuntu
---> 99ec81b80c55
Step 1 : MAINTAINER Victor Coisne [email protected]
---> Using cache
---> 2b58110877f6
Step 2 : RUN echo "deb http://mirrors.163.com/ubuntu/ precise main restricted universe multiverse" > /etc/apt/sources.list
---> Running in f55a4a8bb069
---> d48c6a965398
Step 3 : RUN apt-get update
---> Running in da091a1dd6e7
Ign http://mirrors.163.com precise InRelease
Get:1 http://mirrors.163.com precise Release.gpg [198 B]</p> <p>.... </p> <p>Processing triggers for libc-bin (2.19-0ubuntu6) ...
Processing triggers for ureadahead (0.100.0-16) ...
---> 2886671b5b86
Step 5 : ENTRYPOINT ["memcached"]
---> Running in e8aeeab92cb6
---> 7148293a4053
Step 6 : USER daemon
---> Running in 288766b19606
---> 235e7f630ffa
Step 7 : EXPOSE 11211
---> Running in c6f881b9d51f
---> 666c5d65f396
Successfully built 666c5d65f396
Removing intermediate container f55a4a8bb069
Removing intermediate container da091a1dd6e7
Removing intermediate container f23631d3d45a
Removing intermediate container e8aeeab92cb6
Removing intermediate container 288766b19606
Removing intermediate container c6f881b9d51f

ENVコマンド
環境変数の設定に使用します

コピーコード
コードは以下の通りです。

ENV <key> <value>

一度設定すると、それ以降のRUNコマンドは使用可能です。
この dockerfile で生成したイメージを使って新しいコンテナを作成すると、 docker inspect でこの環境変数を確認することができます。
コピーコード
コードは以下の通りです。

root@tankywoo-docker:~# docker inspect 49bfc7a9817f
...
"Env": [
"name=tanky",
"HOME=/",
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
...

中のname=tankyが設定されているものです。
また、docker実行時に環境変数を設定することで、環境変数を設定・変更することができます。
コピーコード
コードは以下の通りです。

docker run -i -t --env name="tanky" ubuntu:newtest /bin/bash


ADDコマンド
src からコンテナの dest パスにファイルをコピーします。

コピーコード
コードは以下の通りです。

ADD <src> <dest>

<src> は、ビルドされるソースディレクトリへの相対パスで、ファイルまたはディレクトリのパス、あるいはリモートファイルのURLです。
<dest> は、コンテナ内の絶対パスです。
VOLUMEコマンド
コピーコード
コードは以下の通りです。

VOLUME ["<mountpoint>"]

として。
コピーコード
コードは以下の通りです。

VOLUME ["/data"]

共有ディレクトリのマウントポイントを作成する


WORKDIRコマンド

コピーコード
コードは以下の通りです。

WORKDIR /path/to/workdir

RUN、CMD、ENTRYPOINTコマンドで、現在の作業パスを設定する。
複数回設定可能、相対パスの場合は直前のWORKDIRコマンドからの相対パスとなる
例えば
コピーコード
コードは以下の通りです。

WORKDIR /a WORKDIR b WORKDIR c RUN pwd

実際には/a/b/cの下でpwdを実行します。

CMDコマンド
3つのフォーマットがあります。

コピーコード
コードは以下の通りです。

CMD ["executable","param1","param2"] (like an exec, preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (as a shell)

Dockerfileに含まれるCMDは1つだけで、複数ある場合は最後の1つだけが有効になります。