FROM ruby:2.5.5-alpine3.8 as builder
RUN apk update && apk upgrade && \
apk add --no-cache git mysql-dev nodejs nodejs-npm libxml2-dev imagemagick-dev && \
npm install -g yarn
WORKDIR /app
COPY Gemfile Gemfile.lock ./
RUN bundle install -j4 --without development test deployment
COPY package.json yarn.lock ./
RUN yarn install --production --frozen-lockfile
Slide 31
Slide 31 text
# syntax = docker/dockerfile:experimental
FROM ruby:2.5.5-alpine3.8 as base-builder
RUN apk update && apk upgrade && \
apk add --no-cache git mysql-dev nodejs nodejs-npm libxml2-dev imagemagick-dev && \
npm install -g yarn
WORKDIR /app
FROM base-builder as bundle-builder
COPY Gemfile Gemfile.lock ./
RUN bundle install -j4 --without development test deployment
FROM base-builder as yarn-builder
COPY package.json yarn.lock ./
RUN yarn install --production --frozen-lockfile
Slide 32
Slide 32 text
assetsとwebpackの
並列コンパイル
Slide 33
Slide 33 text
...
COPY ./app/assets /app/app/assets
RUN bundle exec rails assets:precompile
...
COPY frontend ./frontend
RUN yarn run webpack --config config/webpack/production.js
Slide 34
Slide 34 text
FROM base-builder as modules-builder
COPY --from=bundle-builder /app/Gemfile /app/Gemfile.lock ./
COPY --from=yarn-builder /app/package.json /app/yarn.lock ./
FROM modules-builder as assets-builder
...
COPY ./app/assets /app/app/assets
RUN bundle exec rails assets:precompile
FROM modules-builder as webpack-builder
...
COPY frontend ./frontend
RUN yarn run webpack --config config/webpack/production.js
Slide 35
Slide 35 text
FROM ruby:2.5.5-alpine3.8 as release
…
COPY --from=builder /app/vendor/bundle/ /app/vendor/bundle/
Slide 36
Slide 36 text
FROM ruby:2.5.5-alpine3.8 as release
…
COPY --from=modules-builder /app/vendor/bundle /app/vendor/bundle
COPY --from=webpack-builder /app/public /app/public
COPY --from=assets-builder /app/public /app/public
...
FROM base-builder as bundle-builder
COPY Gemfile Gemfile.lock ./
RUN bundle install -j4 --without development test deployment
FROM base-builder as yarn-builder
COPY package.json yarn.lock ./
RUN yarn install --production --frozen-lockfile
Slide 41
Slide 41 text
...
FROM base-builder as bundle-builder
COPY Gemfile Gemfile.lock ./
RUN --mount=type=cache,target=/app/tmp \
bundle install --path=/app/tmp/bundle -j4 --without development test deployment
FROM base-builder as yarn-builder
COPY package.json yarn.lock ./
RUN --mount=type=cache,target=/app/tmp \
--mount=type=cache,target=/usr/local/share/.cache/yarn \
yarn install --modules-folder=/app/tmp/node_modules --production --frozen-lockfile
Slide 42
Slide 42 text
FROM base-builder as modules-builder
COPY --from=bundle-builder /app/Gemfile /app/Gemfile.lock ./
COPY --from=yarn-builder /app/package.json /app/yarn.lock ./