自分で作った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
どの部分を見れば良いのかわかりません。
どなたか、お力添えをいただけますと幸いです。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。