有没有一种方法可以使用在 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