Chl*_*loe 5 ruby-on-rails docker docker-compose
我试图在这里遵循指南:https : //docs.docker.com/compose/rails/
docker-compose.yml
version: '3'
services:
pg: ######### LOOK HERE!
image: postgres
volumes:
- ./tmp/db:/var/lib/postgresql/data
web:
build: .
command: bundle exec rails server -p 3000 -b '0.0.0.0'
volumes:
- .:/app
ports:
- "3000:3000"
depends_on:
- pg
links:
- pg ######### LOOK HERE!
cms:
image: joomla
restart: always
links:
- mysql:joomladb
ports:
- 8080:80
environment:
JOOMLA_DB_HOST: mysql
JOOMLA_DB_PASSWORD: example
mysql:
image: mysql:5.6
restart: always
environment:
MYSQL_ROOT_PASSWORD: example
Run Code Online (Sandbox Code Playgroud)
config/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: 5
timeout: 5000
host: pg ######### LOOK HERE!
username: postgres
password:
development:
<<: *default
database: project
# 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: project_test
production:
<<: *default
database: project
Run Code Online (Sandbox Code Playgroud)
安慰
C:\Users\Chloe\workspace\project\src>docker-compose run web rake db:create
Starting src_pg_1 ... done
could not translate host name "pg" to address: No address associated with hostname
Couldn't create database for {"adapter"=>"postgresql", "encoding"=>"unicode", "pool"=>5, "timeout"=>5000, "host"=>"pg", "username"=>"postgres", "password"=>nil, "database"=>"project"}
rake aborted!
PG::ConnectionBad: could not translate host name "pg" to address: No address associated with hostname
Run Code Online (Sandbox Code Playgroud)
docker-compose版本1.20.1,内部版本5d8c71b2,Docker版本18.03.0-ce,内部版本0520e24302
好的,我会尝试回答这个问题:
通常,当出现此错误时,可能意味着运行db容器返回了一些错误并停止了。
我遇到了同样的问题,经过一番挖掘发现我有
LANG='en_US.UTF-8'
LANGUAGE='en_US:en'
LC_ALL='en_US.UTF-8'
Run Code Online (Sandbox Code Playgroud)
在我的环境变量中设置,这导致db容器停止。因此,由于容器没有运行,我没有db主机。
我的docker-compose.yml文件如下所示:
version: '3'
services:
db:
image: postgres
volumes:
- ./tmp/db:/var/lib/postgresql/data
env_file: .env
app:
build: .
command: bundle exec puma -p 3000 -C config/puma.rb
env_file: .env
volumes:
- .:/app
ports:
- "3031:3000"
depends_on:
- db
Run Code Online (Sandbox Code Playgroud)
这是config/database.yml
default: &default
adapter: postgresql
encoding: unicode
host: db
pool: 5
username: <%= ENV['POSTGRES_USER'] %>
password: <%= ENV['POSTGRES_PASSWORD'] %>
development:
<<: *default
database: driggl_dev
test:
<<: *default
database: driggl_test
production:
<<: *default
database: driggl_prod
Run Code Online (Sandbox Code Playgroud)
...以及.env用于开发的文件:
POSTGRES_USER=driggl
POSTGRES_PASSWORD=driggl
Run Code Online (Sandbox Code Playgroud)
由于我有数据库数据的共享卷,因此tmp/db为了确定起见,我从存储库中删除了该文件夹。
rm -rf tmp/*
Run Code Online (Sandbox Code Playgroud)
然后我删除了所有容器和图像
docker rm $(docker ps -q -a) -f
docker rmi $(docker images -q) -f
Run Code Online (Sandbox Code Playgroud)
最后我再次启动容器:
docker-compose up --build
Run Code Online (Sandbox Code Playgroud)
一切终于顺利了。
概括
我希望这会对遇到该问题的任何人有所帮助。
这个设置适用于我在 docker 上运行 Rails。基本上需要指定一个 URL,因此您将使用 .env 文件来指定 postgres url,并且您将使用配置/数据库文件在 _development _test 和 _Production 之间进行更改,只需添加 env 即可。文件到您的 Web 服务 docker-compose 文件:
/docker-compose.yml:
services:
postgres:
image: postgres:9.6
restart: always
environment:
POSTGRES_USER: kunzig #DockerHub postgres docs state this is optional but must be used when password is set. It will also create a db under the supplied username which you'll use to connect to in rails console such as: $docker-compose exec postgres psql -U YourUserNameHere
POSTGRES_PASSWORD: 'whateverPWYouWant'
ports:
- '5432' #Was originally 5432:5432 with the Left hand side being port on host machine, right hand side is the port on the docker container. However I let docker choose the port it will use by supplying because 5432 is running on my local for other projects.
volumes:
- postgres:/var/lib/postgresql/data
web:
build: . #Runs the docker build command on the current directory
links: #Links the listed services to our application so containers can talk to eachother
- postgres
- redis
restart: always
volumes:
- .:/kunzig #Left hand side is current directory of compose file, right hand side is container folder. This needs to be same as Install_path folder in Dockerfile.
ports:
- '8000:8000' #Left is the local port and the right side is the container port
env_file:
- .YourProjectNameHere.env #This should be in your root project directory along side the Dockerfile and docker-compose file
depends_on:
- 'redis'
- 'postgres'
Run Code Online (Sandbox Code Playgroud)
/.项目名称.env
DATABASE_URL=postgresql://PostgresUserNameHere:PasswordFromDockerCompose@postgres:5432/PostgresUsername?encoding=utf8&pool=5&timeout=5000
Run Code Online (Sandbox Code Playgroud)
/config/database.yml
development:
url: <%= ENV['DATABASE_URL'].gsub('?', '_development?' ) %>
test:
url: <%= ENV['DATABASE_URL'].gsub('?', '_test?' ) %>
production:
url: <%= ENV['DATABASE_URL'].gsub('?', '_production?' ) %>
Run Code Online (Sandbox Code Playgroud)
将您的 Web 服务与 pg 服务保持链接,因为您拥有它,您应该很好地继续,只需注意我将我的服务称为 postgres 即可。
| 归档时间: |
|
| 查看次数: |
3743 次 |
| 最近记录: |