【環境構築】【Docker】Dockerfile コマンドについて
Dockerfile コマンドについて
vueプロジェクトをdockerでマウントすることになったので、Docker調査中の備忘録
現在のDockerfile
# ビルド環境
FROM node:lts-alpine as build-stage
# カレントワーキングディレクトリとして 'app' フォルダを指定する
WORKDIR /app
# `package.json` と `package-lock.json` (あれば)を両方コピーする
COPY package*.json ./
# プロジェクトの依存ライブラリをインストールする
RUN npm install
# カレントワーキングディレクトリ(つまり 'app' フォルダ)にプロジェクトのファイルやフォルダをコピーする
COPY . .
# 本番向けに圧縮しながらアプリケーションをビルドする
RUN npm run build
# 本番環境
FROM nginx:stable-alpine as production-stage
COPY --from=build-stage /app/dist /usr/share/nginx/html
EXPOSE 3000
CMD ["nginx", "-g", "daemon off;"]
Dockerfileの書式
Dockerfileの書式は基本的に以下
#コメント
命令 引数
基本的なコマンド
FROM , COPY , RUN , CMD , WORKDIR , ENV , USER
FROM
ベースとなるDocker Image を指定
ここで設定したベースイメージにCOPY や RUN のようなコマンドを重ねてDocker Image を作成
する
ここで設定したイメージを「ベースイメージ」と呼ぶ
コメントを除いて FROM を一番始めに書く
FROM node
書き方は3通り
FROM <image>
or
FROM <image>:<tag>
or
FROM <image>@<digest>
ENV
今回は設定してない
Docker内で使用する環境変数を定義
NODE_ENV のようなDockerの起動時にデフォルトで定義されていてほしい環境変数を定義すると良い
ENV <key> <value>
or
ENV <key>=<value> ...
ENV NODE_ENV=production
WORKDIR
WORKDIR 命令は各種命令を実行する際のカレントディレクトリを指定
WORKDIR /path/to/workdir
COPY
Docker内へホストのファイル/ディレクトリをコピーする
COPY は基本的に2つの引数を設定
第1引数はホスト側のディレクトリ(src)、第2引数はDocker側のディレクトリ(dest)
COPY package*.json ./
これは・・?
COPY . .
RUN
FROMで指定したイメージ上(Docker内)で、シェル形式のコマンドを実行
RUN npm install \
&& groupadd app \
&& useradd -g app app \
&& chown -R app:app /scripts
USER
作成したDocker Image の起動時にログインするユーザーを指定
デフォルトは root が設定されているため、セキュリティリスクを回避するために別のユーザーを指定するのが良い(今回はしていない)
USER app
CMD
Docker起動時にデフォルトで実行されるコマンドを定義
Dockerはここで設定したコマンドがフォアグラウンドで実行されている間が生存期間
下記はnginxに対して、
- gオプションはグローバルなディレクティブ(nginxにおける設定項目)を設定するためにつける
- "daemon off;"の場合は nginxがdaemonとして起動しないようにする
CMD ["nginx", "-g", "daemon off;"]
参照:dockerでnginxを使用する際に"daemon off"することの意味
よく使用されるコマンド
EXPOSE
※今回エラー出たところ(実際はDockerfileの設定が原因ではなかった)
コンテナ起動時に公開するポートを記述
EXPOSE 3000
参照
Discussion