Aje*_*i32 3 ruby-on-rails docker docker-compose
我有一个 Ruby on Rails 应用程序,我正在尝试对其进行容器化,以便可以使用 Docker 进行部署:
version: '3.4'
services:
db:
image: postgres
web:
container_name: my_rails_app
build: .
ports:
- "3000:3000"
depends_on:
- db
Run Code Online (Sandbox Code Playgroud)
作为此应用程序现有构建过程的一部分,当前存在一个脚本,该脚本使用一堆示例数据启动应用程序的测试版本,并获取应用程序各种功能的多个屏幕截图以在帮助文件中使用。该脚本集成到 Ruby on Rails 的资产管道中,因此它作为正常资产预编译过程的一部分运行(下面的 Dockerfile 有所简化):
FROM ruby:2.2.10 AS build
COPY . /opt/my_rails_app
RUN bundle install
# Generates static assets, including screenshots
RUN bundle exec rake assets:precompile
RUN bundle install --deployment --without development test assets
FROM ruby:2.2.10 AS production
ENV RAILS_ENV=production
COPY . /opt/my_rails_app
COPY --from=build vendor/bundle vendor/bundle
COPY --from=build public/assets public/assets
CMD ["bundle", "exec", "rails", "server"]
EXPOSE 3000
Run Code Online (Sandbox Code Playgroud)
现在我的问题是:因为此构建步骤会启动 Web 服务器来截取 UI 屏幕截图,所以它需要能够在构建期间连接到数据库。(如果没有数据库连接,Web 服务器将无法正常运行。)
在旧环境中,这不是问题,因为生产数据库安装在应用程序所在的同一服务器上,因此我可以将其连接到本地主机。不过,使用 Docker 时,数据库运行在由 docker-compose 管理的单独容器中。不幸的是,Docker 似乎不想让我在构建过程中与该容器对话:
could not translate host name "db" to address: Name or service not known
Run Code Online (Sandbox Code Playgroud)
我考虑将预编译步骤推迟到部署之后;但这会显着减慢容器的部署过程,并要求我在生产容器中包含另外 50-100 个不使用的依赖项。
我还考虑过在构建容器上安装数据库,但这似乎会大大减慢构建速度,并且如果构建容器上的数据库与映像提供的数据库不完全匹配,则可能会导致问题postgres。
有没有办法告诉docker启动容器并设置适当的网络连接有没有办法告诉 docker在构建过程或者也许是一种替代解决方案,它没有我上面已经考虑过的其他解决方案的任何缺点?
这是可以做到的,但目前 Docker Compose 还没有很好地支持它。
您想要做的是使用Docker 的内置网络功能来设置包含数据库容器的共享网络,然后在构建过程中将应用程序容器附加到该网络。
如果没有 Docker Compose,这将通过启动数据库容器、使用docker network子命令将其连接到 Docker 网络、然后使用docker build --network $network_name_here ..
使用 Docker Compose,可以通过其name属性为应用程序的默认网络配置静态名称,然后使用network服务build参数的未记录选项来告诉 Compose 在构建过程中为应用程序容器使用该网络来完成此操作:
# Setting network names is only available in version 3.5+
version: '3.5'
services:
db:
image: postgres
web:
container_name: my_rails_app
build:
context: .
# This isn't listed in the official Docker documentation, but it lets you
# specify which network to connect the container to during the build
# process.
network: myapp_default
ports:
- "3000:3000"
depends_on:
- db
networks:
default:
# Set the name of the default network. If you don't do this the name could
# change based on your app's ["project name"][1], which would break your
# build.
#
# [1]: https://docs.docker.com/compose/reference/envvars/#compose_project_name
name: myapp_default
Run Code Online (Sandbox Code Playgroud)
但就其本身而言,这还不够。这是因为默认情况下 Docker Compose 不会在构建期间启动容器的依赖项。要解决此问题,您需要在运行构建之前手动启动数据库容器:
docker-compose up --detach db # Start the database container
docker-compose build # Now run the build
Run Code Online (Sandbox Code Playgroud)
这将允许 Web 服务在构建 Web 服务时连接到数据库服务。
| 归档时间: |
|
| 查看次数: |
1796 次 |
| 最近记录: |