gpt4 book ai didi

ruby-on-rails - Docker,Rails,Postgres-找不到数据库服务错误

转载 作者:行者123 更新时间:2023-12-02 20:36:34 26 4
gpt4 key购买 nike

Docker文件

FROM ruby:2.6.3
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
RUN mkdir /paper_scammer_docker
WORKDIR /paper_scammer_docker
COPY Gemfile /paper_scammer_docker/Gemfile
COPY Gemfile.lock /paper_scammer_docker/Gemfile.lock
RUN bundle install
COPY . /paper_scammer_docker

# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]

docker-compose.yml
version: '3'
services:
db:
image: postgres:10
ports:
- "5432:5432"
volumes:
- ./tmp/db:/var/lib/postgresql/data
web:
build: .
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
volumes:
- .:/paper_scammer_docker
ports:
- "3000:3000"
links:
- "db:db"
depends_on:
- db

我可以使用以下命令成功构建镜像
docker-compose build

如果我在项目根目录中执行 docker-compose up,则我的应用程序运行良好,当我执行 docker container ls时,我可以看到两个容器,一个用于我的rails应用程序,另一个用于postgres。我观察到postgres图像是从库中加载的。

database.yml文件
# SQLite version 3.x
# gem install sqlite3
#
# Ensure the SQLite 3 gem is defined in your Gemfile
# gem 'sqlite3'
#
default: &default
adapter: postgresql
encoding: unicode
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
timeout: 5000
host: db
username: postgres
password:
# user: gnpsllco_papaer
# password: sharma@123

development:
<<: *default
database: paper_scammer_development
# user: postgres
# password: sharma@123

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
<<: *default
database: paper_scammer_test
# user: postgres
# password: sharma@123

production:
<<: *default
database: gnpsllco_paper_scammer

问题

我运行以下命令从rails应用程序的镜像启动docker容器。
sudo docker run -p 3000:3000 paperscammer_web

postgres容器未运行或丢失。

我想了解一下dockerfile-compose如何处理此问题,当我旋转rails应用程序的图像时说,它依赖于postgres服务,是否也不应旋转postgres容器并将“db”设置为连接的主机。

还是需要为postgres手动旋转它。

运行 http://localhost:3000时出现以下错误
could not translate host name "db" to address: Name or service not known

我可以看到postgres容器未运行。

谢谢

最佳答案

docker-compose updocker run是不同的命令。使用后一个将不使用撰写文件,仅使用传递给命令的参数。

使用docker run时,必须指定要专门运行的容器,如果要同时运行dbweb,则应使用此命令两次。

另一方面,当您使用docker-compose up时,将运行docker-compose.yml中指定的所有容器及其所有选项。

另外,depends_on属性仅指定一旦成功启动容器web,就会启动容器db

最后,如果您希望容器之间能够相互通信,则应在撰写文件中添加一个网络:

version: '3'
services:
db:
image: postgres:10
container_name: db
ports:
- "5432:5432"
volumes:
- ./tmp/db:/var/lib/postgresql/data
networks:
- my-network-name

web:
build: .
container_name: web
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
volumes:
- .:/paper_scammer_docker
ports:
- "3000:3000"
links:
- "db:db"
depends_on:
- db
networks:
- my-network-name

networks:
my-network-name:
driver: bridge

添加 container_name来引用它们也是一个好习惯。

使用thoose选项,容器现在可以使用其名称作为IP /主机名进行通信:
http://<container_name>:<port>

例如,容器 web将能够像下面这样连接到 db容器中的数据库:
http://db:5432/gnpsllco_paper_scammer

注意,IP /主机名现在是容器的名称。

正如@LinSel指出的那样,您可以使用以下命令来构建和运行所有容器(不需要sudo):
docker-compose up -d --build

关于ruby-on-rails - Docker,Rails,Postgres-找不到数据库服务错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56886792/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com