介绍
想了很久,想用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
按照官方教程在工作目录下创建如下文件。
这时候别忘了指定你要安装的版本。
# ここでバージョンを修正
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'
# 何も書きません
#!/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 "$@"
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
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中体现一下吧。
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 如下。
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让我们访问
一个熟悉的页面向我打招呼!万岁!
4-7. 使用脚手架进行操作检查
我将使用脚手架快速检查它是否正常工作。
在容器运行时执行以下命令。
$ docker compose exec web bash
$ rails generate scaffold book title:string
$ rails db:migrate
当您访问 localhost:3000/books 时,将显示以下屏幕。
我能够从新书创建数据,然后毫无问题地对其进行编辑和删除。
五、总结
这次稍微修改了一下官方教程,用Docker搭建了一个开发环境。
我认为调查和解决由于此更改而发生的错误的过程在将来会很有用。
其实在开始开发之后,我觉得有时候我觉得这部分是欠缺的。
在这种情况下,我想像这次一样,一边检查必要的库,一边做出回应。
此外,在整理一篇文章时,我创建和销毁图像和容器,并一遍又一遍地创建和销毁它们。
Docker 让创建和破坏这样的东西变得很容易,所以很容易做“让我们使用这个命令”和“让我们安装这个库”之类的实验,这也是 Docker 的吸引力之一。 . (这让我感到不安,因为很难在本地撤消......)
一路上,我跑题了,试图看看如果我使用不同的基础镜像会发生什么,比如Ruby3.0-alpine。
这是一次很好的学习经历,因为我能够发现我以前没有意识到的差异,例如最初安装的库和安装库的命令。
同时,即使我们使用相同的 Ruby 3.0,我觉得我仍然需要更多地研究才能选择最好的图像。
好了,这就是本文的全部内容。
感谢您加入我们的这篇长文。
接下来,我将继续玩Docker,目的是构建一个Rails6 + Vue3 + PostgreSQL 的开发环境!
原创声明:本文系作者授权爱码网发表,未经许可,不得转载;
原文地址:https://www.likecs.com/show-308623300.html