私はサラリーマンである。
ITエンジニアである。明日も7時前に起きて出社の準備をしないといけない。今深夜1時。
この記事を書き終わる頃には2時とかだろう、早く寝ろ俺。
しかし一個だけ言わせてほしい。
dockerお前の仕事は環境の差異をなくすことちゃうんか!?お前が一番差異に困惑しとるやないかぇぇぇぇぇぇウェえええええええ!!!
失礼しました
タイトルの通りrailsをDockerに走らせるだけの簡単なお仕事でミスりまくってものすごい時間を費やしたので書いてます。
試したこと
自分が作ったdeviceでログイン + 文章投稿する という簡単なアプリケーションを
上記リンクを参考にDockercomposeファイルを足してコンテナ化しようとしました。
そもそも使てるアプリケーションがrails 6~
まず手始めにエラーが出たのは
bundler: command not found: rail........
(すいませんエラー出た時のメモ帳に書いてあった文が中途半端に途切れてました。)
なんか、「バンドラーがないぞ」
と言われているらしく、
「bundlerね、なんか聞いたことあるわ」ぐらいで
「ないなら足してしまえ」程度の気持ちで以下の処理をしました。
FROM ruby:2.7.0
RUN gem install bundler
RUN apt-get update -qq && apt-get install -y build-essential nodejs
RUN mkdir /app
WORKDIR /app
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock
RUN bundle install
COPY . /app
この2行目です。ありえないぐらい雑な発想。
# この発想が悲劇の始まりで
この対処でdocker-buildコマンドは機嫌を取り戻したのだが
この後
OCI runtime create failed exec: "rails": executable file not found in $PATH: unknown ERROR:
Can't initialize a new Rails application within the directory of another, please change to a non-Rails directory first
Warning: the running version of Bundler (2.1.2) is older than the version that created the lockfile (2.1.4). We suggest you to upgrade to the version that created the lockfile by running `gem install
こんなエラーがずっと出続けました。
この記事の最終的な解決とはまた違ってくるので全ては説明しませんが、
例えば上記の「バンドラーが古いよ」というエラーに当たった時は
「またエラーか、、、バンドラー更新すればいいんでしょ」
$ rm Gemfile.lock
$ gem install bundler -v 2.1.4
をして再度composeを走らせてみたり、
docker-compose run web bundle update
というコマンドをやってみたりしました。
動いたと思ったらエラー
Your Yarn packages are out of date! Please run `yarn install` to update.
「またエラーかよ」を30000回ほど呟いて気づいたんですが(遅い)
docker内では
「webpackがない」「bundlerがどうの」「yarnがどうのこうの」
みたいなエラーを無限ループしてるなと。
今回参考にしてる
https://zenn.dev/tmasuyama1114/articles/rails-docker-5x-how-to
これにも、
「どのバージョンを指定してもよいのですが rails 6 以降は webpacker, yarn が必要になるので注意してください
ここでは簡単に検証するため rails 5 系を使用」
と書いてありました。(ちゃんと読めよ。)
railsに言いたい
「なんやその謎アップデートは。」
馬鹿なのでまた躓きます
つまりはwebpacker,yarnを入れてやればいいんでしょ?
ということで書いたコードがこれ
FROM ruby:2.7.0
RUN apt-get update -qq && apt-get install -y build-essential nodejs
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
apt-get update && apt-get install -y yarn
RUN mkdir /app
WORKDIR /app
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock
RUN bundle install
RUN yarn install --check-files
RUN bundle exec rails webpacker:compile
COPY . /app
あまりにも愚直で今考えると笑える。
入れればいいってもんじゃないのはわかってるけどとりあえず挿れたくなるのが男ってもんだ。
すると意外なエラー分が出て、、、?
rails aborted!
Unknown version "6.0"
レールは中止されました!
不明なバージョン「6.0」
とのこと、
原因はM1チップでした
この後も色々試したが、動かず、webpackもyarnも入ってる、コードもほとんど例文通り。
そもそも「Docker上にrails走らせるだけ」の簡単なお仕事なのにナゼェ
と思いながらたどり着いた先は
「intelのmacとM1のmacは環境がかなり違う」という絶妙な情報でした。
具体的にどう違うのかなどは結局分からず、使うコマンドもほとんど一緒です。
流石にこんなことで何時間も(何日も)悩んでたわけがないだろうと思っていたけど、切れるカードもないのでこれが最終手段でした。
「Docker rails M1」で検索。
はいでました。
自分のPCのスペックをわきまえよう
最終的には上記の手順に従い、railsを走らせることが出来ました。
最新のmac買えばなんでもできると思ってたあの頃のワイに言いたい。
「大は小を全部兼ねると思うなよバカタレが」と。