將 Ruby on Rails 應用程式容器化
先決條件
- 您已安裝最新版本的 Docker Desktop。
- 您有一個 Git 用戶端。本節中的範例顯示了 Git CLI,但您可以使用任何用戶端。
概觀
本節將引導您完成 Ruby on Rails 應用程式的容器化和執行。
取得範例應用程式
範例應用程式使用熱門的 Ruby on Rails 框架。
複製範例應用程式以搭配本指南使用。開啟終端機,將目錄變更為您想要使用的目錄,然後執行以下指令來複製儲存庫
$ git clone https://github.com/falconcr/docker-ruby-on-rails.git
初始化 Docker 資產
現在您已擁有一個應用程式,您可以建立必要的 Docker 資產來將您的應用程式容器化。您可以使用 Docker Desktop 內建的 Docker Init 功能來協助簡化流程,或者您可以手動建立資產。
用於引導專案 Docker 相關資產的指令 `docker init` 尚不支援 Ruby 程式語言。這表示如果您正在使用 Ruby,您需要手動建立 Dockerfile 和其他相關設定。
在 `docker-ruby-on-rails` 目錄中,建立以下檔案
建立一個名為 `Dockerfile` 的檔案,其中包含以下內容。
# syntax=docker/dockerfile:1
# Use the official Ruby image with version 3.2.0
FROM ruby:3.2.0
# Install dependencies
RUN apt-get update -qq && apt-get install -y \
nodejs \
postgresql-client \
libssl-dev \
libreadline-dev \
zlib1g-dev \
build-essential \
curl
# Install rbenv
RUN git clone https://github.com/rbenv/rbenv.git ~/.rbenv && \
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc && \
echo 'eval "$(rbenv init -)"' >> ~/.bashrc && \
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build && \
echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
# Install the specified Ruby version using rbenv
ENV PATH="/root/.rbenv/bin:/root/.rbenv/shims:$PATH"
RUN rbenv install 3.2.0 && rbenv global 3.2.0
# Set the working directory
WORKDIR /myapp
# Copy the Gemfile and Gemfile.lock
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
# Install Gems dependencies
RUN gem install bundler && bundle install
# Copy the application code
COPY . /myapp
# Precompile assets (optional, if using Rails with assets)
RUN bundle exec rake assets:precompile
# Expose the port the app runs on
EXPOSE 3000
# Command to run the server
CMD ["rails", "server", "-b", "0.0.0.0"]
建立一個名為 `compose.yaml` 的檔案,其中包含以下內容。
services:
web:
build: .
command: bundle exec rails s -b '0.0.0.0'
volumes:
- .:/myapp
ports:
- "3000:3000"
建立一個名為 `.dockerignore` 的檔案,其中包含以下內容。
git
.gitignore
# Created by https://www.gitignore.io/api/git,ruby,rails,jetbrains+all
# Edit at https://www.gitignore.io/?templates=git,ruby,rails,jetbrains+all
### Git ###
# Created by git for backups. To disable backups in Git:
# $ git config --global mergetool.keepBackup false
*.orig
# Created by git when using merge tools for conflicts
*.BACKUP.*
*.BASE.*
*.LOCAL.*
*.REMOTE.*
*_BACKUP_*.txt
*_BASE_*.txt
*_LOCAL_*.txt
*_REMOTE_*.txt
### JetBrains+all ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf
# Generated files
.idea/**/contentModel.xml
# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml
# Gradle
.idea/**/gradle.xml
.idea/**/libraries
# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# *.iml
# *.ipr
# CMake
cmake-build-*/
# Mongo Explorer plugin
.idea/**/mongoSettings.xml
# File-based project format
*.iws
# IntelliJ
out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
# Editor-based Rest Client
.idea/httpRequests
# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser
### JetBrains+all Patch ###
# Ignores the whole .idea folder and all .iml files
# See https://github.com/joeblau/gitignore.io/issues/186 and https://github.com/joeblau/gitignore.io/issues/360
.idea/
# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023
*.iml
modules.xml
.idea/misc.xml
*.ipr
# Sonarlint plugin
.idea/sonarlint
### Rails ###
*.rbc
capybara-*.html
.rspec
/db/*.sqlite3
/db/*.sqlite3-journal
/public/system
/coverage/
/spec/tmp
rerun.txt
pickle-email-*.html
# Ignore all logfiles and tempfiles.
/log/*
/tmp/*
!/log/.keep
!/tmp/.keep
# TODO Comment out this rule if you are OK with secrets being uploaded to the repo
config/initializers/secret_token.rb
config/master.key
# Only include if you have production secrets in this file, which is no longer a Rails default
# config/secrets.yml
# dotenv
# TODO Comment out this rule if environment variables can be committed
.env
## Environment normalization:
/.bundle
/vendor/bundle
# these should all be checked in to normalize the environment:
# Gemfile.lock, .ruby-version, .ruby-gemset
# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
.rvmrc
# if using bower-rails ignore default bower_components path bower.json files
/vendor/assets/bower_components
*.bowerrc
bower.json
# Ignore pow environment settings
.powenv
# Ignore Byebug command history file.
.byebug_history
# Ignore node_modules
node_modules/
# Ignore precompiled javascript packs
/public/packs
/public/packs-test
/public/assets
# Ignore yarn files
/yarn-error.log
yarn-debug.log*
.yarn-integrity
# Ignore uploaded files in development
/storage/*
!/storage/.keep
### Ruby ###
*.gem
/.config
/InstalledFiles
/pkg/
/spec/reports/
/spec/examples.txt
/test/tmp/
/test/version_tmp/
/tmp/
# Used by dotenv library to load environment variables.
# .env
# Ignore Byebug command history file.
## Specific to RubyMotion:
.dat*
.repl_history
build/
*.bridgesupport
build-iPhoneOS/
build-iPhoneSimulator/
## Specific to RubyMotion (use of CocoaPods):
#
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
# vendor/Pods/
## Documentation cache and generated files:
/.yardoc/
/_yardoc/
/doc/
/rdoc/
/.bundle/
/lib/bundler/man/
# for a library or gem, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
# Gemfile.lock
# .ruby-version
# .ruby-gemset
# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
# End of https://www.gitignore.io/api/git,ruby,rails,jetbrains+all
您現在應該在 `docker-ruby-on-rails` 目錄中有以下三個檔案。
- .dockerignore
- compose.yaml
- Dockerfile
要瞭解更多關於這些檔案的資訊,請參閱以下內容
執行應用程式
在 `docker-ruby-on-rails` 目錄中,在終端機中執行以下指令。
$ docker compose up --build
開啟瀏覽器並在 https://127.0.0.1:3000檢視應用程式。您應該會看到一個簡單的 Ruby on Rails 應用程式。
在終端機中,按下 `ctrl`+`c` 以停止應用程式。
在背景執行應用程式
您可以透過新增 `-d` 選項,讓應用程式與終端機分離執行。在 `docker-ruby-on-rails` 目錄中,在終端機中執行以下指令。
$ docker compose up --build -d
開啟瀏覽器並在 https://127.0.0.1:3000