はじめに
最近Railsの開発環境を作成しています。
こちらの記事で構築手順を載せています。
そこで、GitにリポジトリをあげたコードをCloneして起動したところうまく起動できない事態が発生したため手直しのさいに解決した方法をまとめます。また、この記事とは別にWebpackerの問題がもう一つ起きています。
以下の記事から確認ください。
問題
DockerでWebpackerを環境を作成して起動したところ以下のエラーが発生しました。
webpacker_1 | error Command "webpack-dev-server" not found.
何度か起動するとエラーが消えて、git cloneしてくると初回は発生しました。
解決方法
これはyarn install
された際に自動生成される/node_modules
がないためにおこるエラーです。
本来であればWebpackerコンテナの中にyarn install
された時点で/node_modules/webpack-dev-server
が作成されます。しかし、Git clone時はローカルにnode_modules
が存在しないため(gitignoreされているため)ファイルマウントがおきずにこのようなエラーになります。
そこで、Dockerfile内でyarn install
をすることでエラーを解決しました。
FROM ruby:alpine3.13
ARG UID
RUN adduser -D app -u ${UID:-1000} && \
apk update \
&& apk add --no-cache gcc make libc-dev g++ mariadb-dev tzdata nodejs~=14 yarn
WORKDIR /myapp
COPY Gemfile .
COPY Gemfile.lock .
RUN bundle install
COPY --chown=app:app . /myapp
RUN yarn install # 追加
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
# EXPOSE 3000
# CMD ["bundle", "exec", "rails", "server", "-b", "0.0.0.0"]
USER app
RUN mkdir -p tmp/sockets
RUN mkdir -p tmp/pids
そして、このコンテナ内で作成されたnode_modules
を使えばよいのですが、docker-compose.ymlでボリュームを設定していないとコンテナ内のnode_modules
は勝手に削除されます。
【Docker】docker compose upするとnode_modulesがマウントされて消える問題
こちらの記事通りにdocker-compose.yml
でvolumes
マウントして消えないようにします。
またRailsコンテナでもnode_modulesは必要なので(yarn installしたライブラリを利用するので)、こちらにもvolume
を追加します。
version: "3.3"
services:
rails:
build: .
container_name: rails
command: bundle exec puma -C config/puma.rb
volumes:
- .:/myapp
- public-data:/myapp/public
- tmp-data:/myapp/tmp
- log-data:/myapp/log
- /myapp/node_modules # 追加
env_file:
- .env
depends_on:
- db
environment:
WEBPACKER_DEV_SERVER_HOST: webpacker
webpacker:
build: .
volumes:
- .:/myapp
- /myapp/node_modules # 追加
command: ./bin/webpack-dev-server
environment:
WEBPACKER_DEV_SERVER_HOST: 0.0.0.0
ports:
- "3035:3035"
おわりに
yarnやpackage.jsonについて初めて勉強したのでかなり沼りました。
また、ネットにもほしい情報はなく検証をかなりして解決することができました。
このあとにWebapackのCSSやVueが読み込まれなかったり、Template Errorが発生するトラブルを解決していますので困った方は確認してみてください。