Docker 使用相同的名称从另一个容器或主机连接到容器

Docker 使用相同的名称从另一个容器或主机连接到容器,docker,networking,docker-compose,Docker,Networking,Docker Compose,我有一个docker compose文件,包含两个服务—一个数据库和一个应用程序服务,如下所示。该应用程序使用如下所示的env文件中定义的配置连接到数据库 DATABASE\u URL=postgresql://user:password1@localhost:5432/mydbname 我希望能够使用相同的env文件从应用程序容器内部和主机(即从容器外部)连接到数据库 例如,如果我使用上述环境变量(localhost表示数据库主机名)从主机运行应用程序服务器,它将正常工作 但是,如果我从应用程

我有一个docker compose文件,包含两个服务—一个数据库和一个应用程序服务,如下所示。该应用程序使用如下所示的env文件中定义的配置连接到数据库

DATABASE\u URL=postgresql://user:password1@localhost:5432/mydbname

我希望能够使用相同的env文件从应用程序容器内部和主机(即从容器外部)连接到数据库

例如,如果我使用上述环境变量(
localhost
表示数据库主机名)从主机运行应用程序服务器,它将正常工作

但是,如果我从应用程序容器运行应用程序服务器,我需要更改环境变量中的db主机名以使其正常工作:
DATABASE\u URL=postgresql://user:password1@postgresql:5432/mydbname

如何配置docker compose,以便在环境变量中使用相同的主机从主机和应用程序容器进行连接

docker-compose.yml

version: '3.2'

services:
  postgresql:
    image: postgres:11
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password1
    ports:
      - '5432:5432'
    volumes:
      - "/var/postgres/data/:/var/lib/postgresql/data/"

  rails-app:
    build:
      context: ./
      dockerfile: rails-dockerfile.yml
    image: rails-app:0.1
    links:
      - postgresql
    volumes:
      - type: bind
        source: ./
        target: /app
    ports:
      - '3000:3000'
    env_file: .env

volumes:
  vol-postgres:

您不能为类似的内容配置容器,但可以配置主机

如果您在Linux或MacOS上,请向
/etc/hosts
添加一个条目,该条目将
postgresql
映射到本地主机。比如:

127.0.0.1  localhost postgresql
Windows中有一个类似的文件

然后只能使用指向
postgresql
的环境变量


但是请注意,从主机直接访问数据库容器是一种不好的做法。只有在没有更好的解决方案时才使用它。

为什么不能有两个独立的
.env
文件,每个环境一个?@DavidMaze应用程序容器有一个“绑定”卷,该卷与主机使用的目录相同。因此,在容器内或主机上运行应用程序将指向相同的
.env
文件。我的想法是,此设置适用于我的开发环境,在那里我可以从主机或在应用程序容器中运行东西。感谢您关于最佳实践的说明。这是为我的开发环境,所以我可以有不同版本的postgres整齐地运行。