使用Docker制作的Rails6 + Vue3 + PostgreSQL开发环境

介绍

根据下面的文章,Rails6 + PostgreSQL,Vue3我已经用 Docker 构建了每个开发环境。

这一次,我想使用 Docker Compose 来管理这些已经单独构建的开发环境。

目录

1.目录结构

2.完成的文件

3.front/Dockerfile的修改

4.修改dockercompose.yml

5.操作检查

6. 最后

1.目录结构

准备好的文件按如下方式放置在各个目录中。

.
├── api
│   ├── Gemfile
│   ├── Gemfile.lock
│   ├── Dockerfile
│   └── entrypoint.sh
├── front
│   └── Dockerfile
└── dockercompose.yml
    

2.完成文件

这次先把完成的文件展示出来,再说说我对前面几篇文章创建的文件是怎么想的,又是怎么修改的。

./api/Gemfile

source 'https://rubygems.org'

gem 'rails', '~> 6.1'

. / Api / 宝石费。好的

# 何も書きません

./api/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"]

.api/entrypoint.sh

#!/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 "$@"

./front/Dockerfile

FROM node:16.16

RUN apt-get update -qq && yarn global add @vue/cli

WORKDIR /app
COPY . /app

CMD ["yarn", "serve"]

. / 做这个姿势。 yml

version: "3.9"
services:
  db:
    image: postgres
    volumes:
      - postgresql_data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: password

  api:
    build: ./api
    volumes:
      - ./api:/app
    ports:
      - "3000:3000"
    depends_on:
      - db

  front:
    build: ./front
    volumes:
      - ./front:/app
    ports:
      - "8080:8080"

volumes:
  postgresql_data:

3.front/Dockerfile的修改

在上一篇创建的Dockerfile中,最后一条命令是

CMD ["/bin/bash"]

但我将其修复如下:

CMD ["yarn", "serve"]

Dockerfile 中的CMD 是容器启动时运行的命令。

在上一篇文章中,我尝试通过在容器中执行命令来安装Vue,所以我尝试启动bash,但是当我真正进行开发时,当我启动容器时,Vue项目的我希望服务器站起来,所以我如上所述修复了它。

4.修改dockercompose.yml

这次在之前创建的 Rails6 + PostgreSQL 环境中添加 Vue3 时,主要修改的是 dockercompose.yml。

这是我最初创建的 dockercompose.yml:

dockercompose.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

db 容器卷

在之前的设置中,DB数据挂载到主机端的./tmp/db,但我决定在Docker端使用volumes进行管理。

在 Docker 端进行管理的优势官方的描述如下:

  • 卷比绑定挂载更容易备份和迁移。
  • 可以使用 Docker CLI 命令和 Docker API 管理卷。
  • 卷在 Linux 和 Windows 上的容器中工作。
  • 可以在多个容器之间安全地共享卷。
  • 卷驱动程序允许您保存到远程主机或云提供商上的卷。卷中的数据可以在存储期间加密,并且可以使用各种其他功能。
  • 当您创建一个新卷时,其内容将是容器已经准备好的内容。
  • 与来自 Mac 和 Windows 主机的绑定挂载相比,Docker Desktop 上的卷提供了更好的性能。

volumes 被创建并安装到创建的volumes,如下所示。

# volumesを作成
volumes:
  postgresql_data:
# volumesへのマウント
 volumes:
      - postgresql_data:/var/lib/postgresql/data

api容器的删除命令

从 dockercompose.yml 中删除了以下内容:

command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"

当容器以docker compose 启动时,dockercompose.yml 中的 command 会覆盖 Dockerfile 中的 CMD

因此,如果您正在编写相同的内容,请在 Dockerfile 中

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"]

在 dockercompose.yml

command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"

我认为任何一个都可以。

开发的时候本来打算用docker compose来启动容器,所以一开始我想,“写成dockercompose.yml就行了,我们来修复一下Dockerfile吧。”官方的在 中找到如下描述,所以决定修改 dockercompose.yml。

一个 Dockerfile 应该至少有一个 CMD 或 ENTRYPOINT 指令。

我对这一点进行了自己的研究并得出了这个结论,但是我不确定在使用 Docker Compose 时是否应该应用这个官方描述。

如果您有“应该用 dockercompose.yml 编写”或“应该用这两种方式编写”的意见,请随时发表评论。

添加前端容器

本来,这应该是主要部分,但是当我尝试时,

  • 使用build 指定 Dockerfile 路径
  • 使用volumes 设置挂载目标
  • 使用ports将容器的8080端口暴露给宿主机的8080端口

    只是冷漠地设置,就轻松完成了。

5.操作检查

首先,创建 Docker 镜像 → 创建 Rails 应用程序 → Gemfile 已更新,因此重新创建镜像。

$ docker compose build
$ docker compose run --rm --no-deps api rails new . -f -T --api --database=postgresql
$ docker compose build

接下来,设置 database.yml 并创建一个 DB。

数据库.yml

default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password: password
  pool: 5

development:
  <<: *default
  database: api_development


test:
  <<: *default
  database: api_test
$ docker compose run --rm api rails db:create        

现在已经创建了 Rails 应用程序,让我们创建 Vue 项目。

$ docker compose run --rm front vue create .

Vue CLI v5.0.8
? Generate project in current directory? (Y/n) Y
? Please pick a preset: (Use arrow keys)
❯ Default ([Vue 3] babel, eslint) 
? Pick the package manager to use when installing dependencies: (Use arrow keys)
❯ Use Yarn 

现在我们准备启动容器。

$ docker compose up

本地主机:3000,本地主机:8080当您访问时,您会看到每个欢迎页面。

你已经成功用 Docker 搭建了 Rails6 + Vue3 + PostgreSQL 开发环境!

奖金

我被 Rails 和 Vue 的欢迎页面打招呼,所以我感觉还可以,但我也有点不安,我是否可以构建一个我可以真正进行开发的环境。

所以,我决定把这个开发环境引入到我用某教材创建的 Rails + Vue 实时聊天应用中。

将本次创建的Docker相关文件放入应用中,启动容器。

......它工作正常。看起来没问题。

6. 最后

长期环境建设到此结束。

从现在开始,我想在实际开发过程中进行必要的更改。

另一方面,我仍然想尝试使用 Docker。

现在我有兴趣在基础图像上使用 slim 并自己安装必要的库以减小图像大小。

这样一来,在实际动手的过程中,我感兴趣的事情就会增加,但如果我什么都尝试去做,无论我有多少时间,都是不够的。

毕竟,我觉得有目标感对于学习效率和时间效率非常重要。

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

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