使用Docker制作的Rails6 + Vue3 + PostgreSQL开发环境
介绍
根据下面的文章,Rails6 + PostgreSQL,Vue3我已经用 Docker 构建了每个开发环境。
这一次,我想使用 Docker Compose 来管理这些已经单独构建的开发环境。
目录
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