我正在为当前正在研究的Ruby-on-Rails项目构建docker容器,以便可以使用Visual Studio Code的远程功能来开发此项目。在不使用docker容器的情况下,该项目仍应继续工作,因此,我无法对现有代码进行重大更改,而这会危及这一点。
应用程序服务器(Rails)需要连接到在单独容器中运行的MySQL数据库。数据库容器名为db
,我可以使用db
主机名从应用程序容器连接到该容器。
rails的database.yml
配置文件定义了如何连接到数据库,但这是我的问题所在。我不想将主机更改为db
而不是localhost
,因为这意味着普通用户(不使用Docker容器)将不再能够连接到数据库而无需更改此设置文件。我该如何以某种方式启动或更改docker配置,以便在应用程序容器内部以db
而不是localhost
的身份访问db
?
database.yml
:
default: &default
adapter: mysql2
username: ****
password: ****
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
development:
<<: *default
database: ****
# setup local port forwarding for this to work
host: db
port: 3306
docker-compose.yml
:
version: '3.7'
services:
db:
build: ./unipept-db
environment:
MYSQL_ROOT_PASSWORD: ****
MYSQL_DATABASE: ****
MYSQL_USER: ****
MYSQL_PASSWORD: ****
restart: always
ports:
- "3306:3306"
hostname: mysql
phpmyadmin:
depends_on:
- db
image: phpmyadmin/phpmyadmin
ports:
- '8080:80'
environment:
PMA_HOST: db
MYSQL_ROOT_PASSWORD: ****
restart: always
app:
depends_on:
- db
build: ./unipept-application
command: sleep infinity
ports:
- '5000:5000'
volumes:
- ~/.gitconfig:/root/.gitconfig
- ..:/workspace
答案 0 :(得分:2)
用户network_mode: "host"
在您的APP
配置中,然后您可以使用DB
从APP
调用localhost:PORT
phpmyadmin:
depends_on:
- db
image: phpmyadmin/phpmyadmin
ports:
- '8080:80'
environment:
PMA_HOST: db
MYSQL_ROOT_PASSWORD: ****
restart: always
network_mode: "host"
app:
depends_on:
- db
build: ./unipept-application
command: sleep infinity
ports:
- '5000:5000'
network_mode: "host"
volumes:
- ~/.gitconfig:/root/.gitconfig
- ..:/workspace
PS:使用主机网络模式时,已发布的端口将被丢弃
答案 1 :(得分:0)
如果将其设置为database.yml.erb
文件中的环境变量,则可以配置它。您甚至已经有一个示例。您可以设置:
host: <%= ENV.fetch('DB_HOST', 'localhost') %>
在开发中,只需不设置环境变量,它将使用localhost
。在Docker环境中,请进行设置,它将使用该主机名。
version: '3'
services:
db:
image: mysql
app:
build: .
environment:
DB_HOST: db
ports:
- '5000:5000'
您还应该以相同的方式传递数据库凭据之类的信息。