容器化 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 init
(用于为项目启动 Docker 相关资源的命令)尚不支持 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.cn/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 查看应用程序。
您应该看到一个简单的 Ruby on Rails 应用程序。
在终端中,运行以下命令停止应用程序。
$ docker compose down
有关 Compose 命令的更多信息,请参阅 Compose CLI 参考.
总结
在本节中,您学习了如何使用 Docker 容器化和运行 Ruby 应用程序。
相关信息
下一步
在下一节中,您将学习如何使用容器开发应用程序。