1. terufumi1122

    No comment

    terufumi1122
Changes in body
Source | HTML | Preview
@@ -1,111 +1,115 @@
## はじめに
Dockerfileを読めるようになるために、Dockerfileの命令について意味をざっくりまとめました。
どう使うのかイメージがわかない命令も多いですが、**とりあえず読めるようになる**がゴールです。
公式ドキュメントに記載の内容を元にしています。
[| Docker Documentation](https://docs.docker.com/engine/reference/builder/)
## この記事が役に立つ方
- Dockerfileの読み方がよく分からない
- Docker初心者
## この記事のメリット
- Dockerfileの命令が何を示しているのかが(なんとなく)分かる。
## 環境
- macOS Mojave バージョン10.14.6
- シェル:zsh
- Docker:version 19.03.5, build 633a0ea
## Dockerfileとは?
Dockerがイメージを構築するときに読み込むファイルです。
基本構文は、
```
命令 引数
```
のようになります。
Dockerfileにイメージを構築するための**命令**を全て記述し、
```zsh
$ docker build
```
でイメージが構築され、それを元に開発が可能となります。
つまり、Dockerfileが同じであれば、**開発環境は一緒**ということです。
## Dockerfileに記述する命令一覧
公式ドキュメントにあるものを抜粋しました。
構文には触れていませんので、必要に応じて下記をご参照下さい。
[| Docker Documentation](https://docs.docker.com/engine/reference/builder/)
### `FROM`
ベースイメージを指定する。
これを元にその他命令を追加していくため、最初はFROMから記述する必要がある。
DockerHubにあるイメージを使用。
### `RUN`
それまでのイメージをベースに、新規レイヤーでシェルコマンドを実行する。
実行後出来たイメージは、以降の命令にも適用される。
### `CMD`
-デフォルトで実行するコマンドを指定することが出来る。
+`docker run`時にデフォルトで実行するコマンドを指定することが出来る。
1つのDockerfileに1つしか含めることが出来ない。
### `ENTRYPOINT`
-デフォルトで実行するコマンドを指定することが出来る。
-CMDと
+`docker run`時にデフォルトで実行するコマンドを指定することが出来る。
+1つのDockerfileに1つしか含めることが出来ない。
+
+CMDとの違いは下記記事で解説されています。
+[docker CMD とENTRYPOINT の違いを試してみた - Qiita](https://qiita.com/hihihiroro/items/d7ceaadc9340a4dbeb8f)
### `LABEL`
コンテナイメージにメタデータを登録する。
過去`MAINTAINER`で指定していた作者の情報も、`LABEL`で指定するのが推奨とされている。
### `EXPOSE`
ポートの開放を行う。
コンテナ間をリンクするときなどに使用。
### `ENV`
環境変数を指定する。
### `ADD`
ファイルやディレクトリ、リモートファイルURLを追加する。
ただし、rootユーザーのみ実行・書き込み可能な状態で追加されるため、必要に応じて別途パーミッションを変更する必要がある。
### `COPY`
ホスト側からコンテナへファイルやディレクトリをコピーする。
### `VOLUME`
ボリュームのマウントを行う。
### `USER`
実行ユーザーを指定する。
### `WORKDIR`
各種命令を実行する際の作業ディレクトリ(カレントディレクトリ)を指定する。
### `ARG`
`--build-arg`フラグで渡すことが出来る変数を定義する。
### `ONBUILD`
作成するイメージが、別のビルドのベースイメージとして使用されるときに実行される命令を追加する。
### `STOPSIGNAL`
終了時にコンテナに送るシグナルを指定できる。
### `HEALTHCHECK`
コンテナが動作しているかどうかを確認するテストを組み込める。
引数の指定によって30秒に1回動作確認などが出来る。
### `SHELL`
使用するシェルを指定出来る。
## おわりに
実際使っていない命令が半分以上あり、理解不十分:sweat_smile:
これからBest Practicesも読みつつ、人の書いたDockerfileを読みつつで理解を深めていこうと思います。
[Dockerfile Best Practices](http://crosbymichael.com/dockerfile-best-practices.html)
## 参考にさせて頂いたサイト(いつもありがとうございます)
[【入門】Dockerfileの基本的な書き方 | レコチョクのエンジニアブログ](https://techblog.recochoku.jp/1022)
[| Docker Documentation](https://docs.docker.com/engine/reference/builder/)
+[docker CMD とENTRYPOINT の違いを試してみた - Qiita](https://qiita.com/hihihiroro/items/d7ceaadc9340a4dbeb8f)