有没有一种方法可以使用在 Docker 和 localhost 中都可以使用的通用主机名?
Is there a way to use a generic hostname that will work in both Docker and localhost?
我在 Mac OS Big Sur 和 运行 正在使用以下 Docker 版本
$ docker -v
Docker version 20.10.12, build e91ed57
$ docker-compose -v
Docker Compose version v2.2.3
我正在 运行安装一个 Rails 6 应用程序,其数据库配置如下
development:
adapter: mysql2
encoding: utf8
host: host.docker.internal
database: cfs
pool: 5
username: myuser
password: bypass
我必须使用“host.docker.internal”,以便 Rails 应用程序可以在 Docker 中 运行 时访问 Docker 数据库,设置在我的 docker-compose.yml 中像这样
services:
db:
image: mysql:5.7
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
restart: always
volumes:
- ./docker/provision/mysql/init:/docker-entrypoint-initdb.d
environment:
MYSQL_ROOT_PASSWORD: bypass
ports:
# <Port exposed> : < MySQL Port running inside container>
- '3306:3306'
expose:
# Opens port 3306 on the container
- '3306'
…
web:
#restart: always
build: ./my-project
ports:
- "3000:3000"
expose:
- '3000'
command: foreman start
volumes:
- ./my-project/:/app
depends_on:
- db
但是,如果我 运行 本地应用程序没有 Docker,我必须更改我的配置文件以删除“host.docker.internal”并改用“127.0.0.1”(或本地主机).
有没有一种方法可以让我设置一个数据库配置文件,在 Docker 和 Docker 下都可以使用,这样我就不必更改主机大约?
您可以use ERB markup in the database.yml
file,这样您就可以在此处使用环境变量。一般来说,我建议将事物的默认值设置为在普通 non-Docker 开发环境中可以使用的任何默认值。
# config/database.yml
development:
host: <%= ENV['DATABASE_HOST'] || 'localhost' %>
如果您 运行 在数据库主机名不是 localhost
的设置中 – 它在同级容器中,或者您正在使用 cloud-hosted 数据库,例如Amazon RDS – 您可以设置该环境变量。
# docker-compose.yml
version: '3.8'
services:
db:
image: 'mysql:5.7'
et: cetera
web:
build: .
ports:
- '3000:3000'
depends_on:
- db
environment:
DATABASE_HOST: db # <-- will be read in database.yml
我在 Mac OS Big Sur 和 运行 正在使用以下 Docker 版本
$ docker -v
Docker version 20.10.12, build e91ed57
$ docker-compose -v
Docker Compose version v2.2.3
我正在 运行安装一个 Rails 6 应用程序,其数据库配置如下
development:
adapter: mysql2
encoding: utf8
host: host.docker.internal
database: cfs
pool: 5
username: myuser
password: bypass
我必须使用“host.docker.internal”,以便 Rails 应用程序可以在 Docker 中 运行 时访问 Docker 数据库,设置在我的 docker-compose.yml 中像这样
services:
db:
image: mysql:5.7
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
restart: always
volumes:
- ./docker/provision/mysql/init:/docker-entrypoint-initdb.d
environment:
MYSQL_ROOT_PASSWORD: bypass
ports:
# <Port exposed> : < MySQL Port running inside container>
- '3306:3306'
expose:
# Opens port 3306 on the container
- '3306'
…
web:
#restart: always
build: ./my-project
ports:
- "3000:3000"
expose:
- '3000'
command: foreman start
volumes:
- ./my-project/:/app
depends_on:
- db
但是,如果我 运行 本地应用程序没有 Docker,我必须更改我的配置文件以删除“host.docker.internal”并改用“127.0.0.1”(或本地主机).
有没有一种方法可以让我设置一个数据库配置文件,在 Docker 和 Docker 下都可以使用,这样我就不必更改主机大约?
您可以use ERB markup in the database.yml
file,这样您就可以在此处使用环境变量。一般来说,我建议将事物的默认值设置为在普通 non-Docker 开发环境中可以使用的任何默认值。
# config/database.yml
development:
host: <%= ENV['DATABASE_HOST'] || 'localhost' %>
如果您 运行 在数据库主机名不是 localhost
的设置中 – 它在同级容器中,或者您正在使用 cloud-hosted 数据库,例如Amazon RDS – 您可以设置该环境变量。
# docker-compose.yml
version: '3.8'
services:
db:
image: 'mysql:5.7'
et: cetera
web:
build: .
ports:
- '3000:3000'
depends_on:
- db
environment:
DATABASE_HOST: db # <-- will be read in database.yml