質問するログイン新規登録

Q&A

解決済

1回答

288閲覧

rails new で自動生成されたDockerfileと付随したパス問題

inoda

総合スコア11

0グッド

0クリップ

投稿2024/05/14 07:12

0

0

自分で作ったDockerfileか、自動生成されるDockerfileか

状況

学習目的で、dockerでrailsの環境構築を試みています。Dockerfileからコンテナを作成しているわけですが、rails 7.1 から、rails new コマンドを実行するとDockerfileが自動生成されるようになったみたいです。そのため、コンテナで rails new を実行すると競合します。
コンテナ作成時には必要最小限のGemfileの記述だったこともあり、rails new 時に --force オプションをつけていたため、Dockerfileが書き換えられました。

相談したい点

自分の作ったDockerfileのままにするのか、生成されたDockerfileを利用すれば良いのか、良し悪しがわからず決めかねています。
初学者が作ったDockerfileなんかよりはまともなものなのだろうとは思いますが(自分のDockerfileがベースで作られてはいる?)、学習目的のためこれで良いものかという感もあります。

新しい方の機能ではあるため資料も少なく、判断しかねています。
どなたかお力添えを頂ければと思います。

自分が書いたDockerfileとdocker-compose.yml

Dockerfile

1FROM ruby:3.3.1 2 3RUN mkdir /api 4WORKDIR /api 5 6COPY Gemfile /api/Gemfile 7COPY Gemfile.lock /api/Gemfile.lock 8 9RUN bundle install 10 11COPY . /api 12 13COPY entrypoint.sh /usr/bin/ 14RUN chmod +x /usr/bin/entrypoint.sh 15 16ENTRYPOINT ["/usr/bin/entrypoint.sh"] 17 18EXPOSE 3000 19 20CMD ["rails", "server", "-b", "0.0.0.0"] 21

compose.yaml

1services: 2 db: 3 image: mysql:8.0.36 4 environment: 5 MYSQL_ROOT_PASSWORD: password 6 volumes: 7 - mysql-db:/var/lib/mysql 8 ports: 9 - "3306:3306" 10 11 api: 12 build: 13 context: ./backend 14 command: /bin/bash -c "rm -f tmp/pids/server.pid && bundle exec rails server -b '0.0.0.0'" 15 volumes: 16 - ./backend:/api 17 environment: 18 TZ: Asia/Tokyo 19 RAILS_ENV: development 20 depends_on: 21 - db 22 ports: 23 - 3001:3000 24 25volumes: 26 mysql-db: 27

ファイルができた時点で、
$ docker compose run api rails new . --api --force --no-deps --database=mysql

を実行し、プロジェクトテンプレートが作成されると同時に、Dockerfileが自動生成され、forceオプションのため書き換えられました。

自動生成されたDockerfile

Dockerfile

1# syntax = docker/dockerfile:1 2 3# Make sure RUBY_VERSION matches the Ruby version in .ruby-version and Gemfile 4ARG RUBY_VERSION=3.3.1 5FROM registry.docker.com/library/ruby:$RUBY_VERSION-slim as base 6 7# Rails app lives here 8WORKDIR /rails 9 10# Set production environment 11ENV RAILS_ENV="development" \ 12 BUNDLE_DEPLOYMENT="1" \ 13 BUNDLE_PATH="/usr/local/bundle" \ 14 BUNDLE_WITHOUT="production" \ 15 16 17# Throw-away build stage to reduce size of final image 18FROM base as build 19 20# Install packages needed to build gems 21RUN apt-get update -qq && \ 22 apt-get install --no-install-recommends -y build-essential default-libmysqlclient-dev git libvips pkg-config 23 24# Install application gems 25COPY Gemfile Gemfile.lock ./ 26RUN bundle install && \ 27 rm -rf ~/.bundle/ "${BUNDLE_PATH}"/ruby/*/cache "${BUNDLE_PATH}"/ruby/*/bundler/gems/*/.git && \ 28 bundle exec bootsnap precompile --gemfile 29 30# Copy application code 31COPY . . 32 33# Precompile bootsnap code for faster boot times 34RUN bundle exec bootsnap precompile app/ lib/ 35 36 37# Final stage for app image 38FROM base 39 40# Install packages needed for deployment 41RUN apt-get update -qq && \ 42 apt-get install --no-install-recommends -y curl default-mysql-client libvips && \ 43 rm -rf /var/lib/apt/lists /var/cache/apt/archives 44 45# Copy built artifacts: gems, application 46COPY --from=build /usr/local/bundle /usr/local/bundle 47COPY --from=build /rails /rails 48 49# Run and own only the runtime files as a non-root user for security 50RUN useradd rails --create-home --shell /bin/bash && \ 51 chown -R rails:rails db log storage tmp 52USER rails:rails 53 54# Entrypoint prepares the database. 55ENTRYPOINT ["/rails/bin/docker-entrypoint"] 56 57# Start the server by default, this can be overwritten at runtime 58EXPOSE 3000 59CMD ["./bin/rails", "server"] 60

Dockerfileが自動生成されたので、とりあえずこれで動くのか気になって、
$ docker compose build を実行しました。後述する問題は発生しましたが、ビルド&スタート自体は問題なく動きました。

付随して発生した問題

これに起因するものかわかりませんが、コンテナでrails コマンドが見つからない、というエラーが起きています。

❯ docker compose exec api rails db:create
OCI runtime exec failed: exec failed: unable to start container process: exec: "rails": executable file not found in $PATH: unknown

$ docker compose exec api bash
からコンテナに入り、$ gem environment を実行した結果は以下のようになりました。

RubyGems Environment: - RUBYGEMS VERSION: 3.5.9 - RUBY VERSION: 3.3.1 (2024-04-23 patchlevel 55) [aarch64-linux] - INSTALLATION DIRECTORY: /usr/local/bundle - USER INSTALLATION DIRECTORY: /home/rails/.local/share/gem/ruby/3.3.0 - RUBY EXECUTABLE: /usr/local/bin/ruby - GIT EXECUTABLE: - EXECUTABLE DIRECTORY: /usr/local/bundle/bin - SPEC CACHE DIRECTORY: /home/rails/.cache/gem/specs - SYSTEM CONFIGURATION DIRECTORY: /usr/local/etc - RUBYGEMS PLATFORMS: - ruby - aarch64-linux - GEM PATHS: - /usr/local/bundle - /home/rails/.local/share/gem/ruby/3.3.0 - /usr/local/lib/ruby/gems/3.3.0 - GEM CONFIGURATION: - :update_sources => true - :verbose => true - :backtrace => true - :bulk_threshold => 1000 - "install" => "--no-document" - "update" => "--no-document" - REMOTE SOURCES: - https://rubygems.org/ - SHELL PATH: - /usr/local/bundle/bin - /usr/local/sbin - /usr/local/bin - /usr/sbin - /usr/bin - /sbin - /bin rails@e77f9145448a:/rails$ rails -v bash: rails: command not found

どの部分を見れば良いのかわかりません。
どなたか、お力添えをいただけますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自動生成されたDockerfileを読み、さまざまな記事やドキュメントを参考にしまして、自分なりの環境構築が完了したので、自己解決とします。

自動生成されたDockerfileは、本番環境向けのものだと思いますから、とりあえず開発環境を作る目的と合っていないので、自分が書いたものを Dockerfile.devに、自動生成されるものを Dockerfile.prodとして、2つ用意する方針にしました。
自動生成されるものは 「Dockerfile」ですから、forceオプションでの rails new で名前のバッティングは起きません。
その上で、compose.yamlにて、

compose.yaml

1build: 2 context: ./backend 3 dockerfile: Dockerfile.dev 4 5以下略

とすることで、読むDockerfileを指定しました。

結論

開発環境として使うのは自分が書いた Dockerfileで、
自動生成されたDockerfileは名前を変えて残しておくという、どっちつかずな方法を取ることになってしまいました。
自動生成されたDockerfileの中身をじっくり調べることで、Dockerfileにどのような要素が必要なのか少しわかった気がします。
今後開発が進んでいく中で、自分のプロジェクトにあったコードの取捨選択ができるようになっていくのではないかと思います。

今回は回答はつきませんでしたが、読んで考えてくださった方いらっしゃいましたら、お時間を使っていただいてありがとうございました。

補足

結局、自分で作ったDockerfileからは、パス問題は起きませんでした。なんだったんだ。

投稿2024/05/15 10:33

inoda

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問