paint-brush
在使用 React web前端采用程序对 Ruby 和 Rails 参与“Dockerazition”的简化版导则 经途@forison
291 讀數

使用 React 前端应用程序对 Ruby 和 Rails 进行“Dockerazition”的简化指南

Addo Boakye Forison13m2024/08/04
Read on Terminal Reader

太長; 讀書

Dockerization 涉及两个关键概念:镜像和容器。镜像是容器的蓝图,包含创建容器所需的所有信息。容器是镜像的运行时实例,由镜像本身、执行环境和运行时指令组成。在本文中,我们将详细介绍如何将 Rails 和 React 应用程序 docker 化。
featured image - 使用 React 前端应用程序对 Ruby 和 Rails 进行“Dockerazition”的简化指南
Addo Boakye Forison HackerNoon profile picture
0-item
1-item

使用的 React 最前端使用方式将 Ruby on Rails 贮槽化会对应系数缓和您的的开发技术作业操作流程和设置流程。利用为您的使用方式創建规定化条件,您会狠抓在的开发技术、公测、分娩的有所不一样的关键期,虽然有所不一样的环节区间内保持良好相符的行为举动。事实真相上,它有何意义最大的最大地才能减少与环节差异化对应的话题。本规范将引导系统您成功完成让您的 Rails 和 React 使用方式在 Docker 贮槽中能顺利正常运作的通常部骤。

Docker 来救援

为什么要对应用程序进行 Docker 化?

  • 跨环境的一致性
    • Docker 切实保障软件子程序究竟是否部暑在何方(究竟是否是在开发建设员的器机、测试仪环境依然是分娩服务的器上)都以相同之处的方式英文行驶。这般一直性是用不锈钢容器化所以依赖于项和手机配置来实现了的。


  • 依赖管理
    • Docker 烧杯富含利用程度电脑运行需求的所以根据项。这意示着软件库的发生变化或多种软件上紧缺的根据项不是导致利用程度的功能表。


  • 隔离
    • Docker 容器设计真正的爱情自立小程序运行,但会与监控主机平台隔开。这款隔开可杜绝指定平台上有所不同选用小程序非常依赖症项之前发生问题。


  • 可移植性
    • Docker 容器可以轻松移动并运行在任何支持 Docker 的系统上,无论是本地机器、云服务还是专用服务器。这使得应用程序在部署方面具有高度的可移植性和灵活性。


特别注意:


Docker 化相关好几个关键的观念:映射和储罐。映射是储罐的信标,蕴含有个储罐的需求的所有的相关信息,以及信任项和安排系统配置。储罐是映射的启用时具体方法,由映射本就、连接环镜和启用时指令表组合成。综合所说,Docker 为工具的车辆运输建立联系了标准单位。


用一家简短的对比来释意 Docker:将罐体想像中成院里里的集包散货船,将数字图像想像中成放在这一些集包散货船内的物料,将运送船想像中成电脑运行罐体的控制系统。


无论何时设置和构建应用程序,某些环境配置都是必需的。例如,如果系统上没有安装 Ruby 环境,则无法运行 Rails 应用程序。同样,如果没有Node.js ,则无法运行 React 应用程序,如果没有npmYarn等 Node 包管理器,则无法安装 React 包。


随着场所与朋友体统分隔行驶,大家大家将使任何以上包在大家大家的场所中需用,就好像大家大家随便在大家大家的体统上建设方案它同样,于是,场所将身为一种独立空间的体统,就好像人体机同样。docker 和人体机中长期存在对比,但这一个案例可是为了让逐步骤解释清楚。


现在,让我们继续将 Rails 应用程序 docker 化。为此,我们将需要 Rails 应用程序中的三个文件: Dockerfiledocker-compose.ymlbin/docker-entrypoint 。让我们详细检查每个文件。


注意:

Dockerfile

Dockerfile是创建 Docker 容器的蓝图。它包含 Docker 用于构建映像的一系列指令,然后可以使用这些指令运行容器。让我们分解 Ruby on Rails 和 React 应用程序的Dockerfile

. 基础镜像

ARG RUBY_VERSION=3.1.4 FROM ruby:$RUBY_VERSION
  • ARG RUBY_VERSION=3.1.4 :定义一个名为RUBY_VERSION的构建参数,默认值为3.1.4 。这可以在构建时被覆盖。


  • FROM ruby:$RUBY_VERSION :使用由RUBY_VERSION指定的版本的ruby 基础镜像。这将使用 Ruby 运行时设置容器。正如我之前提到的,要运行 Rails 应用程序,您需要安装 Ruby。

2.安装依赖项

RUN apt-get update -qq && \ apt-get install -y build-essential libvips bash bash-completion libffi-dev tzdata postgresql curl && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* /usr/share/doc /usr/share/man
  • apt-get update -qq :从存储库更新软件包列表,使用-qq进行静默输出。


  • apt-get install -y ... :安装各种软件包:
    • build-essential :构建软件的基本软件包(如 GCC)。

    • libvips :图像处理库。

    • bashbash-completion :Bash shell 及其自动完成功能。

    • libffi-dev :外部函数接口库。

    • tzdata :时区数据。

    • postgresql :PostgreSQL 数据库客户端。

    • curl :从 URL 传输数据的工具。


  • apt-get clean :清理检索到的包文件的本地存储库。


  • rm -rf /var/lib/apt/lists/ /usr/share/doc /usr/share/man :删除软件包列表和文档以减小图像大小。

3.安装Node.js和Yarn

 RUN curl -fsSL //deb.nodesource.com/setup_current.x | bash - && \ apt-get install -y nodejs && \ curl -sS //dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ echo "deb //dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ apt-get update && \ apt-get install -y yarn
  • curl -fsSL //deb.nodesource.com/setup_current.x | bash - :下载并运行 NodeSource 安装脚本来安装 Node.js。


  • apt-get install -y nodejs :安装 Node.js。


  • curl -sS //dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - :添加 Yarn GPG 密钥来验证其软件包。


  • echo "deb //dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list :将 Yarn 的存储库添加到源列表中。


  • apt-get update && apt-get install -y yarn :更新包列表并安装 Yarn。

4.环境变量

ENV NODE_OPTIONS=--openssl-legacy-provider
  • ENV NODE_OPTIONS=--openssl-legacy-provider :设置环境变量以启用对 Node.js 的旧版 OpenSSL 支持。

5.设置工作目录

WORKDIR /rails
  • WORKDIR /rails :将后续指令的工作目录设置为/rails

6. 建立参数和环境变量

ARG RAILS_ENV ENV RAILS_ENV=$RAILS_ENV
  • ARG RAILS_ENV :定义一个名为RAILS_ENV的构建参数,用于指定 Rails 环境(如developmenttestproduction )。


  • ENV RAILS_ENV=$RAILS_ENV :将环境变量RAILS_ENV设置为构建参数的值。

7. 安装应用程序 Gems

 COPY Gemfile Gemfile.lock ./ RUN bundle install
  • COPY Gemfile Gemfile.lock ./ :将GemfileGemfile.lock复制到工作目录。


  • RUN bundle install :安装Gemfile中指定的 Ruby 宝石。

8. 安装前端依赖项

COPY package.json yarn.lock ./ RUN yarn install --frozen-lockfile
  • COPY package.json yarn.lock ./ :将package.jsonyarn.lock复制到工作目录。


  • RUN yarn install --frozen-lockfile :使用 Yarn 安装前端依赖项,确保它使用yarn.lock中的精确版本。

9.复制应用程序代码

COPY . .
  • COPY . . :将所有应用程序代码复制到工作目录。

10.预编译Bootsnap代码

RUN bundle exec bootsnap precompile --gemfile app/ lib/
  • RUN bundle exec bootsnap precompile --gemfile app/ lib/ :预编译 Bootsnap 缓存,以加快 Rails 应用程序的启动时间。Bootsnap 是一个通过缓存昂贵的计算来加快 Ruby 和 Rails 启动时间的 gem。

11. 预编译生产资源

RUN if [ "$RAILS_ENV" = "production" ]; then \ SECRET_KEY_BASE=1 bin/rails assets:precompile; \ fi
  • RUN if [ "$RAILS_ENV" = "production" ]; then ... :仅当RAILS_ENV设置为production时才有条件地运行资产预编译。此步骤对于为生产环境准备资产至关重要。

12.入口点脚本

COPY bin/docker-entrypoint /rails/bin/ RUN chmod +x /rails/bin/docker-entrypoint
  • COPY bin/docker-entrypoint /rails/bin/ :将自定义入口点脚本复制到容器。


  • RUN chmod +x /rails/bin/docker-entrypoint :使入口点脚本可执行。

13. 定义入口点和命令

ENTRYPOINT ["/rails/bin/docker-entrypoint"] EXPOSE 5000 // you can use any port of your choice CMD ["./bin/rails", "server"]
  • ENTRYPOINT ["/rails/bin/docker-entrypoint"] :设置容器启动时将运行的入口点脚本。此脚本通常设置环境、准备数据库并启动应用程序。


  • EXPOSE 5000 :表示容器监听 5000 端口,这是一个文档功能,并不发布端口。


  • CMD ["./bin/rails", "server"] :指定容器启动时默认运行的命令,即启动Rails服务器。

docker-compose.yml

docker-compose.yml文件用于定义和运行多容器 Docker 应用程序。它允许您在单个文件中配置应用程序的服务、网络和卷。在本例中,我们将使用两个服务。以下是 Rails 应用程序的docker-compose.yml文件:

1.数据库服务( db

 codedb: image: postgres:14.2-alpine container_name: demo-postgres-14.2 volumes: - postgres_data:/var/lib/postgresql/data command: "postgres -c 'max_connections=500'" environment: POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} ports: - "5432:5432"
  • image: postgres:14.2-alpine :指定用于此服务的 Docker 映像。在本例中,它是基于 Alpine Linux 发行版的 PostgreSQL 14.2 映像。Alpine 映像以体积小而闻名,这有助于降低整体映像大小。


  • container_name: demo-postgres-14.2 :将容器命名为demo-postgres-14.2 。此名称用于在命令和日志中引用容器。


  • volumes
    • postgres_data:/var/lib/postgresql/data:将命名卷postgres_data挂载到容器内的/var/lib/postgresql/data 。此目录是 PostgreSQL 存储其数据的地方,确保数据库数据在容器重启之间保持不变。


  • command: "postgres -c 'max_connections=500'" :覆盖 PostgreSQL 映像的默认命令。它使用配置选项启动 PostgreSQL,以将最大连接数增加到 500。


  • environment
    • POSTGRES_DB: ${POSTGRES_DB} :使用环境变量POSTGRES_DB设置要创建的默认数据库的名称。

    • POSTGRES_USER: ${POSTGRES_USER} :使用POSTGRES_USER环境变量设置访问 PostgreSQL 数据库的默认用户名。

    • POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} :使用POSTGRES_PASSWORD环境变量设置默认用户的密码。


  • ports
    • "5432:5432" :将主机上的端口 5432 映射到容器中的端口 5432。这允许通过端口 5432 访问主机上的 PostgreSQL。

2. Web 应用服务 ( demo-web )

 codedemo-web: build: context: . args: - RAILS_ENV=${RAILS_ENV} command: "./bin/rails server -b 0.0.0.0" environment: - RAILS_ENV=${RAILS_ENV} - POSTGRES_HOST=${POSTGRES_HOST} - POSTGRES_DB=${POSTGRES_DB} - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - RAILS_MASTER_KEY=${RAILS_MASTER_KEY} volumes: - .:/rails - app-storage:/rails/storage depends_on: - db ports: - "3000:3000"
  • build:

    • context: . :指定 Docker 镜像的构建上下文。在本例中, .指的是当前目录。这意味着 Docker 将使用当前目录中的 Dockerfile 来构建镜像。
    • args
      • RAILS_ENV=${RAILS_ENV} :将RAILS_ENV构建参数传递给 Docker 构建过程,允许您指定 Rails 环境(如developmenttestproduction )。


  • command: "./bin/rails server -b 0.0.0.0" :覆盖 Docker 镜像的默认命令。启动 Rails 服务器并将其绑定到所有网络接口 ( 0.0.0.0 ),这对于从容器外部访问服务是必需的。


  • environment:

    • RAILS_ENV=${RAILS_ENV} :使用RAILS_ENV环境变量设置容器内的 Rails 环境。

    • POSTGRES_HOST=${POSTGRES_HOST} :设置 PostgreSQL 主机地址。

    • POSTGRES_DB=${POSTGRES_DB} :设置数据库名称。

    • POSTGRES_USER=${POSTGRES_USER} :设置 PostgreSQL 用户。

    • POSTGRES_PASSWORD=${POSTGRES_PASSWORD} :设置 PostgreSQL 用户密码。

    • RAILS_MASTER_KEY=${RAILS_MASTER_KEY} :设置 Rails 主密钥,用于加密凭证和其他机密。


  • volumes

    • .:/rails :将当前目录( docker-compose.yml文件所在的目录)挂载到容器内的/rails 。这样您就可以在主机上编辑文件,并将这些更改反映在容器内。

    • app-storage:/rails/storage :将命名卷app-storage挂载到容器内的/rails/storage 。这通常用于存储 Rails 特定文件,例如日志、上传和缓存文件。


  • depends_on

    • db :确保demo-web服务在启动前等待db服务准备就绪。Docker Compose 根据此设置处理启动服务的顺序。
  • ports:

    • "3000:3000" :将主机上的端口 3000 映射到容器中的端口 3000。这样你就可以通过端口 3000 访问主机上的 Rails 应用程序。

    codevolumes: postgres_data: app-storage:
    • postgres_data :定义一个命名卷postgres_data ,由db服务用来保存 PostgreSQL 数据。
    • app-storage :定义一个命名卷app-storage ,由demo-web服务用来保存特定于应用程序的数据,例如上传和日志。

bin/docker-entrypoint

bin/docker-entrypoint脚本是 Docker 设置的关键部分。它在容器启动时执行,通常处理环境设置、数据库准备以及启动主应用程序之前所需的其他初始化任务。以下是bin/docker-entrypoint脚本示例以及每个部分的详细说明:

发生错误时退出

bashCopy code#!/bin/bash set -e
  • #!/bin/bash :此行指定应使用 Bash shell 运行脚本。


  • set -e :如果任何命令返回非零退出代码,则指示脚本立即退出。这有助于确保如果任何步骤失败,脚本将停止执行,从而可以防止后续步骤在无效状态下运行。


有条件的数据库创建或迁移

# If running the rails server then create or migrate existing database if [ "${*}" == "./bin/rails server" ]; then ./bin/rails db:create ./bin/rails db:prepare fi


  • if [ "${*}" == "./bin/rails server" ]; then ... fi :此条件语句检查传递给脚本的命令 ( "${*}" ) 是否为./bin/rails server*是一个特殊参数,它保存传递给脚本的所有位置参数。


  • ./bin/rails 数据库

    :如果满足条件,此命令将尝试创建数据库。它相当于运行rails db:create ,按照数据库配置文件 ( config/database.yml ) 中的定义设置数据库。


  • ./bin/rails 数据库

    :此命令将运行rails db:prepare ,以确保数据库已设置并迁移。如果数据库不存在,它将创建数据库;如果数据库已创建,它将运行迁移。这是rails db:createrails db:migrate的组合。

    执行主流程

    bashCopy codeexec "${@}"
    • exec "${@}" :这会将当前 shell 进程替换为作为参数传递给脚本的命令。 @符号包含传递给脚本的所有位置参数。例如,如果使用./bin/rails server调用脚本,则此行实际上会将./bin/rails server作为容器的主进程运行。

结论

精心编写的Dockerfile对于为 Ruby on Rails 和 React 应用程序创建可靠且一致的环境至关重要。通过定义基础映像、设置环境变量和安装依赖项,您可以确保应用程序在各种环境中顺利运行。


Docker 不禁简单了您的定制开发流程步骤,还增长了生孩子中软件软件应用过程的可靠的性。尽管说另外其他还要改进的地方,但这不过是对咋样将 Rails 软件软件应用过程 docker 化的似的综述。

生成的Dockerfiledocker-compose.ymlbin/docker-entrypoint的完整脚本

ARG RUBY_VERSION=3.1.4 FROM ruby:$RUBY_VERSION # Install dependencies RUN apt-get update -qq && \ apt-get install -y build-essential libvips bash bash-completion libffi-dev tzdata postgresql curl && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* /usr/share/doc /usr/share/man # Install Node.js and Yarn RUN curl -fsSL //deb.nodesource.com/setup_current.x | bash - && \ apt-get install -y nodejs && \ curl -sS //dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ echo "deb //dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ apt-get update && \ apt-get install -y yarn # Set environment variable to enable legacy OpenSSL support ENV NODE_OPTIONS=--openssl-legacy-provider # Rails app lives here WORKDIR /rails # Set environment variable for the build ARG RAILS_ENV ENV RAILS_ENV=$RAILS_ENV # Install application gems COPY Gemfile Gemfile.lock ./ RUN bundle install # Install frontend dependencies COPY package.json yarn.lock ./ RUN yarn install --frozen-lockfile # Copy application code COPY . . # Precompile bootsnap code for faster boot times RUN bundle exec bootsnap precompile --gemfile app/ lib/ # Precompiling assets for production without requiring secret RAILS_MASTER_KEY RUN if [ "$RAILS_ENV" = "production" ]; then \ SECRET_KEY_BASE=1 bin/rails assets:precompile; \ fi # Entrypoint prepares the database. COPY bin/docker-entrypoint /rails/bin/ RUN chmod +x /rails/bin/docker-entrypoint # Use an absolute path for the entry point script ENTRYPOINT ["/rails/bin/docker-entrypoint"] # Start the server by default, this can be overwritten at runtime EXPOSE 5000 CMD ["./bin/rails", "server"]


 services: db: image: postgres:14.2-alpine container_name: demo-postgres-14.2 volumes: - postgres_data:/var/lib/postgresql/data command: "postgres -c 'max_connections=500'" environment: POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} ports: - "5432:5432" demo-web: build: context: . args: - RAILS_ENV=${RAILS_ENV} command: "./bin/rails server -b 0.0.0.0" environment: - RAILS_ENV=${RAILS_ENV} - POSTGRES_HOST=${POSTGRES_HOST} - POSTGRES_DB=${POSTGRES_DB} - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - RAILS_MASTER_KEY=${RAILS_MASTER_KEY} volumes: - .:/rails - app-storage:/rails/storage depends_on: - db ports: - "3000:3000" volumes: postgres_data: app-storage:



 #!/bin/bash set -e # If running the rails server then create or migrate existing database if [ "${*}" == "./bin/rails server" ]; then ./bin/rails db:create ./bin/rails db:prepare fi exec "${@}"


바카라사이트 바카라사이트 온라인바카라