💬
よく使うdockerコマンドとDockerfile設定
概要
dockerを勉強するため使い方をまとめていく
Dockerfile
docker build時にdocker イメージをビルドするために利用するファイル。中身はコマンドで、順次実行しイメージを作成する。
ファイル例(golangのアプリケーションをビルドしている)
FROM golang:latest
WORKDIR /usr/local/app
COPY go.mod go.sum ./
RUN go mod download && go mod verify
COPY . .
RUN go build -v -o /usr/local/bin/app ./...
CMD ["app"]
命令 | 意味 | 備考 |
---|---|---|
FROM | イメージビルドのための処理ステージを初期化し、ベースイメージを設定する。 | |
WORKDIR | 以降に続く RUN 、 CMD 、 ENTRYPOINT 、 COPY 、 ADD 命令の処理時に(コマンドを実行する場所として)使う 作業ディレクトリworking directory を指定する。なければ作る。 | |
COPY | 追加したいファイル、ディレクトリを <コピー元> で指定すると、これらをイメージのファイルシステム上のパス <コピー先> に追加する。COPY [--chown=<ユーザ>:<グループ>] <コピー元>... <コピー先> COPY [--chown=<ユーザ>:<グループ>] ["<コピー元>",... "<コピー先>"]
|
|
RUN | 現在のイメージの最上位の最新レイヤーにおいて、あらゆるコマンドを実行し、処理結果を確定する。 | |
CMD | コンテナ実行時のデフォルト(初期設定)を指定する。複数の CMD 命令があれば、最後の CMD のみ有効。CMD ["実行ファイル","パラメータ1","パラメータ2"] ( exec形式。推奨) CMD ["パラメータ1", "パラメータ2"] ( ENTRYPOINT のデフォルトパラメータ ) CMD コマンド パラメータ1 パラメータ2 (シェル形式) |
参考
ベストプラクティス
Github Actionsで利用する場合のDockerfileの注意点
Github ActionsでDocker buildを行う場合にはDockerfileの各コマンドに以下の制約がある。
命令 | 注意点 | 備考 |
---|---|---|
FROM | 公式のDockerイメージを使う。GitHub Actionsは、DockerがサポートするデフォルトのLinuxの機能をサポートする。 | |
WORKDIR | 利用しない(github actionsの環境変数 GITHUB_WORKSPACEで設定する) | |
ENTRYPOINT | github actionsでentrypointを定義するとこちらが上書きされる。 WORKDIR を使用せず、絶対パスを使用する。 exec 形式の場合、アクションのメタデータ ファイルの args はコマンド シェルで実行されない。変数の置換が必要な場合は、shell 形式を使用する。 アクションのメタデータ ファイルで定義されている args を、ENTRYPOINT で exec 形式を使用している Docker コンテナーに指定するには、ENTRYPOINT 命令から呼び出す entrypoint.sh というシェル スクリプトを作成する。 |
|
CMD | アクションのメタデータ ファイルで args を定義すると、args によって、Dockerfile で指定された CMD 命令がオーバーライドされる。 |
docker build
Dockerfile からイメージを構築する。
docker build [オプション] パス | URL | -
例
docker build -t my-golang-app .
オプション
オプション | 意味 | 備考 |
---|---|---|
-t | 名前と、オプションでタグを 名前:タグ の形式で指定(= --tag) |
参考
docker run
プロセスを隔離(isolated;分離)したコンテナ内(isolated container)で実行する。
docker run [オプション] イメージ[:タグ|@ダイジェスト値] [コマンド] [引数...]
例
docker run -it --rm -p 80:3000 --name aichatbot-app-running aichatbot-app
オプション
オプション | 意味 | 備考 |
---|---|---|
--rm | コンテナの終了時に、自動的にコンテナをクリーンアップし、ファイルシステムを削除する | |
-it | -iと-tを同時に指定する書き方 | コマンド上でrunする場合によくつけるオプション |
-i | アタッチされていなくても STDIN は開放し続ける。(= --interactive) | |
-t | 擬似 TTY(標準入出力先) を割り当てる。(= --tty) | |
-p | コンテナ上の公開されたポートをホストシステム上のポートにマッピングする。(= --port) | |
--name | コンテナーに名前を割り当てる | |
-v | ボリュームのバインド・マウント(= --volume) | |
-w | コンテナー内部のワーキングディレクトリ。(--workdir) |
参考
docker tag
対象イメージ(TARGET_IMAGE)に元イメージ(SOURCE_IMAGE)を参照するタグをつける。タグ名を指定しないと既存のローカル・バージョンのエイリアス httpd:latest が作成される。
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
↓がめちゃくちゃわかりやすい
例
# ローカルにある ID 「0e5574283393」イメージを「fedora」リポジトリの「version 1.0」とタグ付け
docker tag 0e5574283393 fedora/httpd:version1.0
# ローカルにある名前が 「httpd」のイメージを、「fedora」リポジトリの「version 1.0」とタグ付け
docker tag httpd fedora/httpd:version1.0
# ローカルにあるaichatbot-appイメージをECRのaichatbot-repositoryリポジトリに紐づける
docker tag aichatbot-app public.ecr.aws/j3a2u6t5/aichatbot-repository:latest
参考
docker push
リポジトリまたはレジストリに対してDockerイメージをプッシュする。
docker push [オプション] NAME[:TAG]
例
docker push public.ecr.aws/j3a2u6t5/aichatbot-repository:latest
参考
Discussion