介绍

想了很久,想用Docker搭建一个环境用于个人开发,

  • 换工作的时候在自己的作品集的开发环境中使用的时候,发现了一个貌似可以用的代码,研究了一下代码的意思,介绍了一下,但是再看的时候,没有真不明白。
  • 我没有深入了解,因为我使用已经准备好工作的Dockerfile构建环境,通常只是启动容器并继续开发。

当我意识到这一点时,我感到了一种危险的感觉。

所以,这次我一边想一边尝试着用 Docker 搭建环境。
通过写一篇关于这个过程的文章,如果我能清醒头脑并帮助处于类似情况的人注意到,我会很高兴。

顺便说一句,我目前的目标是用 Docker 为 Rails6 + Vue3 + PostgreSQL 构建一个开发环境,但我决定专注于 Rails6 + PostgreSQL,而不是一下子跳进去。

目录

一、开发环境
2. 目标
3. 本文未涵盖的内容
4.主要故事
 4-1. 前期准备
 4-2. 创建应用程序
 4-3. 安装纱线
 4-4. 再次创建应用
 4-5. 数据库设置
 4-6. 访问localhost:3000
 4-7. 使用脚手架进行操作检查
五、总结

一、开发环境

  • macOS 蒙特雷 12.3.1
  • 码头工人 20.10.13
  • docker-compose 1.29.2

2. 目标

用 Docker 搭建如下开发环境

  • Ruby on Rails 6.1
  • 红宝石 3​​.0
  • PostgreSQL

3. 本文未涵盖的内容

  • 关于 Docker 基础知识,例如镜像和容器
  • 关于代码的详细解释

4.主要故事

关于这次要搭建的Rails + PostgreSQL开发环境,Docker官网有教程,这里我们将在以下基础上进行

但是,由于本教程使用的是旧版本 Ruby 2.5 和 Rails 5,因此本文的重点是将它们更改为本文设定的目标版本。

4-1. 前期准备

首先准备工作目录。

$ mkdir docker-sample
$ cd docker-sample

按照官方教程在工作目录下创建如下文件。
这时候别忘了指定你要安装的版本。

Dockerfile
# ここでバージョンを修正
FROM ruby:3.0 

RUN apt-get update -qq \
    && apt-get install -y nodejs postgresql-client

WORKDIR /app
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock

RUN bundle install

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

CMD ["rails", "server", "-b", "0.0.0.0"]
宝石文件
source 'https://rubygems.org'
# ここでバージョンを修正
gem 'rails', '~> 6.1'
Gemfile.lock
# 何も書きません
圈试点 t。嘘
#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /app/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"
码头工人-compose.yml
version: "3.9"
services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: password
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/app
    ports:
      - "3000:3000"
    depends_on:
      - db

4-2. 创建应用程序

准备好上述文件后,使用以下命令创建应用程序。

$ docker compose run --no-deps web rails new . --force --database=postgresql

这是此命令的简要说明。

docker compose run --no-deps web 表示在 docker-compose.yml 中定义的 web 容器中执行以下命令(rails new)。
--no-deps 选项告诉我们不要启动我们正在链接的容器(在这种情况下是depends_on 指定的db 容器)。

使用rails new . --force --database=postgresql 创建一个应用程序。
. 表示在当前目录下创建应用。
如果存在同名文件,--force 是一个覆盖选项。
这一次,之前准备好的 Gemfile 和 Gemfile.lock 都在当前目录下,所以会被覆盖。
如您所见,--database=postgresql 指定 PostgreSQL 作为数据库。

好吧,这里很快,但我遇到了错误。内容如下。

Yarn not installed. Please download and install Yarn from https://yarnpkg.com/lang/en/docs/install/

我被叫来安装纱线。

说到这,我听说 Webpacker 是 Rails6 的默认设置。(参考)
看来这个webpacker需要yarn,所以好像生气了。

4-3. 安装纱线

想马上安装yarn,所以报错中也列出来了官方网站了解如何安装。

似乎有一种使用 npm 的方法和一种不使用它的方法。
当前的 Dockerfile 没有安装 npm。
从现在开始,如果我使用yarn,我不需要为此安装npm,所以我决定这次不使用它。

我还尝试了 npm install 方法并且它有效。
Docker 的另一个吸引力是您可以重新创建图像和容器并轻松试用它们!

看来你需要选择一个操作系统才能看到如何在没有 npm 的情况下安装 yarn。
码头枢纽我去看看,但我没有立刻找到它。
如果找不到,想知道是否可以直接进入容器查看,所以我会尝试查找是否有OS信息。
似乎操作系统信息保存在/etc/os-release 中。
然后,因为只是为了查看OS信息,所以准备了一个最小的Dockerfile给Ruby 3.0,也就是这次的基础镜像,在创建的容器中查看OS信息。

这是准备好的Dockerfile

Dockerfile
FROM ruby:3.0

CMD ["/bin/bash"]

CMD ["/bin/bash"] 将在您启动容器时启动 bash。

现在创建映像并使用以下命令启动容器:

$ docker image build -t os_check .
$ docker container run --rm -it os_check

-t 选项只是为这个图像命名,以便以后管理,所以不要太担心。

既然容器已经启动成功了,我们先来看一下前面包含OS信息的文件。

$ cat /etc/os-release

这是输出结果

PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

事实证明,这个基础镜像的操作系统是 Debian,一个 Linux 发行版。
您现在可以安全地继续安装纱线。

既然是大事,我们就照原样在容器中运行yarn安装命令吧。

$ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
$ echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
$ apt-get update -qq
$ apt-get install -y yarn

$ yarn -v
1.22.19

看来已经安装的很完美了,我们在Dockerfile中体现一下吧。

Dockerfile
FROM ruby:3.0

RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
    && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
    && apt-get update -qq \
    && apt-get install -y nodejs yarn postgresql-client

WORKDIR /app
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock

RUN bundle install

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

CMD ["rails", "server", "-b", "0.0.0.0"]

4-4. 再次创建应用

再次尝试以下命令。

$ docker compose run --no-deps web rails new . --force --database=postgresql

现在您已经成功创建了一个 Rails 应用程序!

现在 Gemfile 已经被重写,让我们构建图像。

$ docker compose build

4-5. 数据库设置

再次,回到官方教程并设置数据库。
修改创建的 Rails 应用的 config/database.yml 如下。

数据库.yml
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password: password
  pool: 5

development:
  <<: *default
  database: app_development


test:
  <<: *default
  database: app_test

4-6. 访问localhost:3000

首先,运行以下命令来启动容器并创建数据库。

$ docker compose up -d
$ docker compose run web rails db:create

好的,现在你已经准备好了。
本地主机:3000让我们访问
壁にぶち当たりながらDockerで環境構築をする(Rails6 + PostgreSQL)
一个熟悉的页面向我打招呼!万岁!

4-7. 使用脚手架进行操作检查

我将使用脚手架快速检查它是否正常工作。

在容器运行时执行以下命令。

$ docker compose exec web bash 
$ rails generate scaffold book title:string
$ rails db:migrate

当您访问 localhost:3000/books 时,将显示以下屏幕。
我能够从新书创建数据,然后毫无问题地对其进行编辑和删除。
壁にぶち当たりながらDockerで環境構築をする(Rails6 + PostgreSQL)

五、总结

这次稍微修改了一下官方教程,用Docker搭建了一个开发环境。
我认为调查和解决由于此更改而发生的错误的过程在将来会很有用。

其实在开始开发之后,我觉得有时候我觉得这部分是欠缺的。
在这种情况下,我想像这次一样,一边检查必要的库,一边做出回应。

此外,在整理一篇文章时,我创建和销毁图像和容器,并一遍又一遍地创建和销毁它们。
Docker 让创建和破坏这样的东西变得很容易,所以很容易做“让我们使用这个命令”和“让我们安装这个库”之类的实验,这也是 Docker 的吸引力之一。 . (这让我感到不安,因为很难在本地撤消......)

一路上,我跑题了,试图看看如果我使用不同的基础镜像会发生什么,比如Ruby3.0-alpine
这是一次很好的学习经历,因为我能够发现我以前没有意识到的差异,例如最初安装的库和安装库的命令。
同时,即使我们使用相同的 Ruby 3.0,我觉得我仍然需要更多地研究才能选择最好的图像。

好了,这就是本文的全部内容。
感谢您加入我们的这篇长文。

接下来,我将继续玩Docker,目的是构建一个Rails6 + Vue3 + PostgreSQL 的开发环境!


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308623300.html

相关文章:

  • 2021-11-03
  • 2022-12-23
  • 2022-01-22
  • 2022-02-07
  • 2021-12-25
  • 2022-01-03
  • 2021-11-19
  • 2021-10-26
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-09-13
  • 2021-11-03
  • 2021-09-27
  • 2021-09-28
相关资源
相似解决方案