Dockerfile
を元にイメージを構築する。
Dockerfile
が存在するディレクトリで実行する。
$ docker build .
-f
オプションを使うことで Dockerfile のパスを指定できる。
$ docker build -f /path/to/Dockerfile .
ベースイメージを指定する。
FROM <image>[:<tag>][AS <name>]
AS <name>
でステージに名前を付けて、以降の FROM
と COPY --from=<name>
命令で構築イメージを参照できる。
シェルとして実行される。
RUN /bin/sh -c 'source $HOME/.bashrc;' \
echo $HOME
1 行で書く場合。
RUN /bin/sh -c 'source $HOME/.bashrc; echo $HOME'
bash/sh
以外のシェルを使う場合は exec
形式でシェルに引数を渡す。
RUN ["/bin/bash", "-c", "echo hello"]
exec
形式で書く場合は json 配列として扱わるため ""
で囲む必要がある。
Dockerfile
内の CMD
命令は 1 つのみ。複数あっても最後の CMD
命令のみが実行される。
CMD の目的はコンテナの実行時のデフォルトの処理を指定する
FROM ubuntu
CMD ["/usr/bin/wc", "--help"]
<src>
で指定したファイル、ディレクトリをコンテナ内の <dest>
にコピーする。
ローカルのファイルをコンテナにコピーしたい場合は COPY
を使う。
ADD
はローカルでの圧縮ファイルの展開やリモートファイルの展開したい場面で使う。
ADD [--chown=<ユーザ>:<グループ>] <src> <dest>
COPY [--chown=<ユーザ>:<グループ>] <src> <dest>
コンテナが接続するためのリッスンするポートを指定する。
EXPOSE 80
実際にはポートの公開は行われない。ドキュメント的な用途として使われる。
実際に公開して使うには、 docker run
の際にフラグをつける。
$ docker run --rm -it -p 80:80 <image> bash
環境変数の設定をする。
ENV <key>=<value>
環境変数は、 Dockerfile
内の変数として使える。
使い方は、 $variable_name
もしくは、 ${variable_name}
FROM <image>
ENV FOO=/bar
WORKDIR ${FOO} # WORKDIR /bar
最適な使い方はイメージに対してメインのコマンドを設定しておき、 CMD
を使ってデフォルトフラグを指定する。
ENTRYPOINT ["go"]
CMD ["--help"]
パラメータを指定して起動することでコマンドの実行ができる。
$ docker run <image> run main.go
コンテナによって作成されるファイルやフォルダの公開に使う。イメージの可変的な部分、ユーザが設定可能な部分について使う。
非 root ユーザで実行可能な場合は USER
を使ってユーザの変更する。
USER <ユーザ>[:<グループ>]
Dockerfile で続く RUN
、 CMD
、 ENTRYPOINT
、 COPY / ADD
の命令の処理時で使う作業ディレクトリを指定する。
build
時にユーザが渡せる変数を定義する。
構築時には docker build --build-arg <変数名>=<値>
を指定する。
ARG <name>[=<デフォルト値>]
サービスを定義する。
ビルド時に適用される。
services:
webapp:
build: ./dir
context
でパスを指定し, Dockerfile
や args
も指定できる。
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
image
名と tag
を指定できる。
build: ./dir
image: webapp:tag
Dockerfile
を含むディレクトリへのパスか、 git リポジトリの URL を指定する。
build:
context: ./dir
別の Dockerfile
を指定する。この場合、ビルドパスを同時に指定する必要がある。
build:
context: .
dockerfile: Dockerfile-alternate
ビルド時にのみ有効な環境変数を設定する。 個々をマッピングするか、リストで書く.ブール値はクォートで囲む。
build:
context: .
args:
buildno: 1
gitcommithash: abc123
build:
context: .
args:
- buildno=1
- gitcommithash=abc123
デフォルトのコマンドを上書きする。
command: bundle exec thin -p 3000
リスト形式も可能。
command: ["bundle", "exec", "thin", "-p", "3000"]
サービス起動の依存関係を表す。 以下の場合、 db と redis の起動後に web が起動する。
version: "3.9"
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
デフォルトのエントリーポイントを上書きする。
entrypoint: /code/entrypoint.sh
リスト形式も可能。
entrypoint: ["php", "-d", "memry_limit=1", "vendor/bin/phpunit"]
環境変数を追加する。 個々をマッピングするか,リストで書く.ブール値はクォートで囲む。
environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:
environment:
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET
ホストマシンにはポートを公開せずに,ポートを expose する. リンクされたサービスのみアクセス可能。
expose:
- "3000"
- "8000"
実行する docker-compose.yml
以外から起動されたコンテナをリンクする。
コンテナ名とエイリアス名 (CONTAINER:ALIAS) を指定する。
external_links:
- redis_1
- project_db_1:mysql
ホスト名をマッピングに追加する。
/etc/hosts
に追加される。
extra_hosts:
- "somehost:162.242.195.82"
公開用のポートを設定する。
ホスト側とコンテナ側のポートを指定する( HOST:CONTAINER
)。
もしくは、コンテナ側のポートを指定する。
ports:
- "3000"
- "3000-3005"
- "8000:8000"
- "9090-9091:8080-8081"
- "49100:22"
- "127.0.0.1:8001:8001"
- "127.0.0.1:5000-5010:5000-5010"
- "6060:6060/udp"
- "12400-12500:1240"
複数のサービスにわたってボリュームを再利用したい場合、最上位の volumes
キーで名前付きボリュームを定義する。
以下の場合、 db サービスのデータディレクトリは、 backup サービスのボリュームにも共有させている。
version: "3.9"
services:
db:
image: db
volumes:
- data-volume:/var/lib/db
backup:
image: backup-service
volumes:
- data-volume:/var/lib/backup/data
volumes:
data-volume:
短い書き方では、 [SOURCE:]TARGET[:MODE]
と書ける。 ro
は readonly
。
- ./cache:/tmp/cache:ro
シェル環境に POSTGRES_VERSION=9.3
が定義されていると、 postgres のバージョンは 9.3 になる。
db:
image: "postgres:${POSTGRES_VERSION}"
環境変数が設定されていない場合は空文字になる。
環境変数のデフォルト値は .env
ファイルに設定しておくことができる。
default
として評価されるdefault
として評価される