ruby-on-rails - 为什么我的 Docker PostgreSQL 容器不再运行?
问题描述
自从我将适用于 Windows 的 Docker Desktop 从 2.1.0.5 更新到版本 2.2.0.3 以来,我的应用程序的 db 容器出现了问题。这一切在 2.1.0.5 之前都可以正常工作,但现在即使在我删除 2.2.0.3 并恢复到 2.1.0.5 之后它也无法正常工作。真希望我现在没有更新。
我得到的错误是:
could not translate host name "db" to address: Name or service not known
当我运行 docker ps 时,我可以看到 postgres 容器甚至没有运行。
我尝试过的一些事情是:
将 db 添加到我的 Windows 10 主机文件中。
在 docker-compose.yml 中为数据库公开端口 5432
没有任何效果。
谁能提供任何见解来帮助我理解和解决问题?
我的 Docker 文件:
FROM ruby:2.5
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /my-app
WORKDIR /my-app
RUN echo 'gem: --no-document' >> ~/.gemrc
COPY . /my-app
EXPOSE 3000
我的 docker-compose.yml:
version: '3'
services:
db:
image: postgres
volumes:
- postgres:/var/lib/postgresql/data/
redis:
image: 'redis:4-alpine'
environment:
- REDIS_DISABLE_COMMANDS=FLUSHDB,FLUSHALL
ports:
- '6379:6379'
command: redis-server --requirepass somepassword
volumes:
- redis:/data/
myapp:
build: ./myapp/
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
environment:
- RAILS_ENV=development
- PORT=3000
- REDIS_URL=redis://:somepassword@redis:6379/0
ports:
- '3000:3000'
working_dir: /myapp/
volumes:
- ./myapp:/myapp:cached
- myapp_gems:/usr/local/bundle/
- /myapp/tmp/
depends_on:
- db
- redis
myapp_sidekiq:
build: ./myapp/
command: bash -c "rm -f tmp/pids/server.pid && bundle exec sidekiq -C config/sidekiq.yml"
environment:
- RAILS_ENV=development
- PORT=3000
- REDIS_URL=redis://:somepassword@redis:6379/0
working_dir: /myapp/
volumes:
- ./myapp:/myapp:cached
- myapp_gems:/usr/local/bundle/
- /myapp/tmp/
depends_on:
- db
- redis
volumes:
postgres:
external: true
redis:
external: true
myapp_gems:
我的数据库.yml:
# Configure Using Gemfile
# gem 'pg'
#
default: &default
adapter: postgresql
encoding: unicode
# For details on connection pooling, see rails configuration guide
# http://guides.rubyonrails.org/configuring.html#database-pooling
pool: 5
host: db
username: postgres
password:
编辑:作为对@Brits 的回应,这里是 docker-compose up db 的输出:
Attaching to dev_db_1
db_1 | Error: Database is uninitialized and superuser password is not specified.
db_1 | You must specify POSTGRES_PASSWORD to a non-empty value for the
db_1 | superuser. For example, "-e POSTGRES_PASSWORD=password" on "docker run".
db_1 |
db_1 | You may also use "POSTGRES_HOST_AUTH_METHOD=trust" to allow all
db_1 | connections without a password. This is *not* recommended.
db_1 |
db_1 | See PostgreSQL documentation about "trust":
db_1 | https://www.postgresql.org/docs/current/auth-trust.html
dev_db_1 exited with code 1
这很有趣,因为我之前没有指定 POSTGRES_PASSWORD,它运行良好。
感谢@Brits,我能够找到问题所在。它是由最近对 docker-library/postgres 的一个不为人知的更改引起的,该更改需要默认指定 POSTGRES_PASSWORD,正如Github 问题中所指出的
解决方案
感谢@Brits,我能够找到问题所在。
它是由最近对 docker-library/postgres 的一个不为人知的更改引起的,该更改需要默认指定 POSTGRES_PASSWORD,正如Github 问题中所指出的
以下是解决方法:
将 POSTGRES_PASSWORD 作为环境变量添加到 docker-compose.yml(postgres 容器和 app 容器):
version: '3'
services:
db:
image: postgres
environment:
- POSTGRES_PASSWORD=somepassword
volumes:
- postgres:/var/lib/postgresql/data/
redis:
image: 'redis:4-alpine'
environment:
- REDIS_DISABLE_COMMANDS=FLUSHDB,FLUSHALL
ports:
- '6379:6379'
command: redis-server --requirepass somepassword
volumes:
- redis:/data/
myapp:
build: ./myapp/
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
environment:
- RAILS_ENV=development
- PORT=3000
- REDIS_URL=redis://:somepassword@redis:6379/0
- POSTGRES_PASSWORD=somepassword
ports:
- '3000:3000'
working_dir: /myapp/
volumes:
- ./myapp:/myapp:cached
- myapp_gems:/usr/local/bundle/
- /myapp/tmp/
depends_on:
- db
- redis
myapp_sidekiq:
build: ./myapp/
command: bash -c "rm -f tmp/pids/server.pid && bundle exec sidekiq -C config/sidekiq.yml"
environment:
- RAILS_ENV=development
- PORT=3000
- REDIS_URL=redis://:somepassword@redis:6379/0
working_dir: /myapp/
volumes:
- ./myapp:/myapp:cached
- myapp_gems:/usr/local/bundle/
- /myapp/tmp/
depends_on:
- db
- redis
volumes:
postgres:
external: true
redis:
external: true
myapp_gems:
然后在应用程序的 database.yml 中为 POSTGRES_PASSWORD 添加 ENV 变量:
# Configure Using Gemfile
# gem 'pg'
#
default: &default
adapter: postgresql
encoding: unicode
# For details on connection pooling, see rails configuration guide
# http://guides.rubyonrails.org/configuring.html#database-pooling
pool: 5
host: db
username: postgres
password: <%= ENV['POSTGRES_PASSWORD'] %>
推荐阅读
- node.js - HTTP:返回客户端响应的行业标准
- python - multiprocessing.Pool.map() 方法抛出 AttributeError
- android - Android 中的通知访问设置问题:收到“此功能在此设备上不可用”消息
- angular - 如何使用离子原生 http 访问资产目录?
- ios - iOS Beta 5 SwiftUI 列表重复单个项目
- c++ - C++ Primer 第 5 版练习 3.20 向向量添加元素
- c# - Group by 语句无法翻译成 SQL
- php - 确保没有缺失的列值被发送到 INSERT 语句
- python - 如何从张量元组创建 TF 数据集?(和最佳实践)
- splunk - 在 Splunk 中,如何为柱形图中的条形设置固定颜色?