LoginSignup
37
36

More than 3 years have passed since last update.

Nuxt.js v2.0.0 を Docker Multi-stage build を使って Docker化 ハンズオン

Last updated at Posted at 2018-09-25

Nuxt.js が v2.0.0 がリリースしました!

Releases Nuxt.js v2.0.0
https://github.com/nuxt/nuxt.js/releases/tag/v2.0.0

まだ全部のリリースは追えてませんが、プロジェクトの管理を更に楽にする機能が増えたという印象です。仕事で Nuxt.js はお世話になっているので随時追っていきます。せっかくなので今回は 新しく出た Nuxt.js v2.0.0 と Docker multi stage build を使って、軽量なイメージの作り方をハンズオン形式で紹介します。

Nuxt.js v2.0.0 のプロジェクトを作る

まず、新しく出た Nuxt向けのコマンドラインツールである create-nuxt-app を使って Nuxt.js のプロジェクトを作ります。

$ yarn global add create-nuxt-app
$ create-nuxt-app try-nuxt2-docker # try-nuxt2-docker は任意のプロジェクト名です

何個か質問されますが、僕は下記のように答えました。

? Project name try-nuxt2-docker
? Project description My top-notch Nuxt.js project
? Use a custom server framework koa 
? Use a custom UI framework none
? Choose rendering mode Universal
? Use axios module yes
? Use eslint yes
? Use prettier no
? Author name po3rin
? Choose a package manager yarn
$ cd try-nuxt2-docker
$ yarn dev

http://localhost:3000
にアクセスすると Nuxt.js のデフォの画面が見れます。
ここからこれを Docker化していきます。今後 3000番は使うので Ctrl + C でアプリケーションを停止しておきましょう。

multi stage build で Nuxt.js を Docker化

multi stage build は アプリケーションを Build するイメージと、実行のイメージを分けることにより、実行用イメージには「実行に必要なものだけ」を入れて実行します。つまり、実行イメージを大幅に軽量化できるということに繋がります。それでは早速、Nuxt.js を Docker化していきます。プロジェクトのルートに Dockerfile を作ります。

FROM node:10.11.0-alpine as builder

WORKDIR /app
ENV NODE_ENV=production

RUN  apk add --no-cache curl git && cd /tmp && \
    curl -#L https://github.com/tj/node-prune/releases/download/v1.0.1/node-prune_1.0.1_linux_amd64.tar.gz | tar -xvzf- && \
    mv -v node-prune /usr/local/bin && rm -rvf * && \
    echo "yarn cache clean && node-prune" > /usr/local/bin/node-clean && chmod +x /usr/local/bin/node-clean

ADD package.json ./
RUN yarn --frozen-lockfile --non-interactive && node-clean
ADD . ./
RUN yarn build


FROM node:10.11.0-alpine
![nu-do.png](https://qiita-image-store.s3.amazonaws.com/0/186028/a46ed467-f210-b540-aad9-178b4667f123.png)
![nu-do.png](https://qiita-image-store.s3.amazonaws.com/0/186028/00594dcd-4698-706a-1688-e9158bbedcf8.png)

WORKDIR /app
ENV HOST=0.0.0.0

ADD package.json ./
ADD nuxt.config.js ./

COPY --from=builder ./app/server ./server/
COPY --from=builder ./app/node_modules ./node_modules/
COPY --from=builder ./app/.nuxt ./.nuxt/
COPY --from=builder ./app/static ./static/

EXPOSE 3000
CMD ["yarn", "start"]

FROM を境に Build用ステージと実行用ステージが分かれています。Buildステージで Nuxt.js を Buildして、本当に必要なものだけ Buildステージからコピーしてきて、実行ステージで Run しているのが分かります。これを行うことで、本当に必要な実行イメージを軽量に保てます。

更に、上記のイメージでのポイントは Go言語で作られたコマンドラインツール node-prune で重くなりがちな node_modeles を軽量化しています。

node-prune
https://github.com/tj/node-prune

実務で使った際には 30MB ほど node_modelues を軽量化できました。ちなみに node-prune はソースコードの prune.go を読めば、どんなファイルを削ってくれるのかわかります。

prune.go
https://github.com/tj/node-prune/blob/master/prune.go

これで Dockerfile ができました!僕は環境変数の管理等がめんどいので、Dockerfile と同じ階層に docker-compose.yml を作って管理します。もちろんdocker run しても大丈夫です。

version: '3'

services:
  example:
    build: ./
    ports:
      - "3000:3000"
    restart: always

これで準備完了です。早速実行しましょう。

docker-compose up -d

http://localhost:3000
にアクセスすると、create-nuxt-app で指定した Node.js のフレームワークが Nuxt.js で作ったアプリケーションを返してくれます。

これで Docker + multi stage build を使って Nuxt.js を実行する コンテナが立ちました!

37
36
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
37
36