Postgresql 如何在构建时在Docker映像之间建立网络?

Postgresql 如何在构建时在Docker映像之间建立网络?,postgresql,docker,docker-compose,dockerfile,docker-networking,Postgresql,Docker,Docker Compose,Dockerfile,Docker Networking,我有一个项目sample,有两个服务,数据库和应用程序,在docker compose.yml中声明: version: "3.8" services: database: image: sample/database build: context: . dockerfile: database.Dockerfile network: sample_default ports: - "8001

我有一个项目
sample
,有两个服务,
数据库
应用程序
,在
docker compose.yml
中声明:

version: "3.8"
services:
  database:
    image: sample/database
    build:
      context: .
      dockerfile: database.Dockerfile
      network: sample_default

    ports:
    - "8001:5432"

  app:
    image: sample/app
    build:
      context: .
      dockerfile: app.Dockerfile
      network: sample_default
      args:
        - DATABASE_URL=postgresql://postgres:password@database:5432/cluster

    depends_on:
      - database

networks:
  sample_default: {}
database.Dockerfile
负责下载和安装Postgre,以及启动Postgre集群和集群内的数据库。此数据库的表是在构建时通过
CREATE TABLE
RUN
命令下创建的

app.Dockerfile
负责下载和安装编译器,以及编译源代码

为了构建
app.Dockerfile
的映像,必须首先构建
数据库.Dockerfile
的映像。这是因为,在编译时,源代码中的SQL查询字符串会根据在
database.Dockerfile
中创建的数据库进行验证

编译器使用
数据库\u URL
连接到Postgre数据库,该数据库包含用于验证查询的表。在这个
数据库\u URL
中,指定的地址是
数据库:5432
,因为服务发现可以在非默认网桥网络上使用

我的问题是,在运行
docker compose up
时,构建时的
app
无法在构建时连接到
数据库。
应用程序中的
运行ping数据库
。Dockerfile
失败,原因是
ping:数据库:没有与主机名关联的地址
。然而,从
sample\u default
网络上的两个图像启动容器(手动而不是通过
docker compose
)并从
app
的容器运行
ping数据库
是成功的


我已经在
docker compose.yml
中的
build
下指定了
network
,那么在此基础上我可以做些什么来允许构建时联网?

在构建时,没有出现网络配置。因为Docker容器类似于VM。您无法通过VM的IP地址在启动时连接到VM。docker容器也一样。唯一的区别是容器的快速启动过程比虚拟机;因此,您需要等到它出现。启动容器后,它的生命周期就是运行时。

添加取决于yml文件中的节。 例如


正如我已经看到的,您使用dependens\u,这已经是一个很好的开始;)

以下是我的另一个项目的docker-compose.yml,我建议使用不同的docker-compose版本:

  • 你可能需要一个
  • 您可以在其中为每个映像分配自定义ip地址
我需要设置数据库连接,以便在docker网络中通过服务器对mongo db运行量角器ui测试,因此,我还需要对服务器上的特定端口进行运行状况检查。如果UI测试没有成功,它将在失败时重新启动

version: "3" # docker-compose version: 1.21.1 for version 3 misleading I know: check out https://sreeninet.wordpress.com/2017/03/28/comparing-docker-compose-versions/
services:
  server:
    build: server # frontend code stored as static files in node server
    ports:
      - "4000:4000"
      - "8443:8443"
    links:
      - mongo
    depends_on:
      - mongo
    networks:
      app_net:
        ipv4_address: 192.17.1.3
    healthcheck:
      # test: ["CMD", "curl", "-k", "https://localhost:8443"]
      # test: ifconfig
      test: curl -k http://192.17.1.3:8443
      # test: curl http://localhost:8443/bundle.js -k -s | grep -C 3 "window.pushNotification"
      interval: 30s
      timeout: 10s
      retries: 3
  mongo:
    image: mongo # pulling on docker-compose up if image not available
    #    volumes: # TODO mongo2.6
    #      - /Users/yuqiuge/Downloads/mongodb-osx-x86_64-2.6.10/data/db:/data/db
    #      - /data/db:/data/db
    ports:
      - "27017:27017"
    networks:
      app_net:
        # static different ip for mongo
        ipv4_address: 192.17.1.2
  protractor:
    build: webapp
    restart: on-failure
    depends_on:
      - server
    links:
      - server
    networks:
      app_net:
        # static different ip for ui test on webapp
        ipv4_address: 192.17.1.4

networks:
  app_net:
    driver: bridge
    driver_opts:
      com.docker.network.enable_ipv6: "false"
    ipam:
      driver: default
      config:
        - subnet: 192.17.1.0/24

我正在查看,我看到
--network
允许我“在构建期间为运行指令设置网络模式”。这就是为什么我认为网络可以在构建期间完成,这指的是什么?你可以在构建期间附加网络配置,但你必须等到它成为运行时,才能通过构建期间完成的网络配置进行访问。啊,我忘了从我的实际docker compose文件中复制
取决于
。编辑为包含问题中的
依赖
,问题仍然存在。从docker compose文件中删除
网络:示例默认值
,然后重试。默认情况下,它将创建自己的网络。只是一个想法,您应该尝试看看它是否有效:您可以在docker中使用docker,然后在docker中创建服务容器,并以与gitlag类似的方式构建容器。看看我是否理解正确,这是一个等待问题。应用程序需要等待数据库生成,因为正在运行?我说得对吗?是否有连接重试?我从未见过“网络”属性的用法,我见过“网络”。这是正确的吗?如果现在指定了网络,该服务将添加到默认网络。@mr.vea是的,应用程序需要等待数据库生成,因为应用程序编译器依赖于数据库。我认为您对默认网络的看法是正确的,但我的挑战是在docker映像构建时而不是运行时使用它。您是否尝试过多级构建dockerfile?
version: "3" # docker-compose version: 1.21.1 for version 3 misleading I know: check out https://sreeninet.wordpress.com/2017/03/28/comparing-docker-compose-versions/
services:
  server:
    build: server # frontend code stored as static files in node server
    ports:
      - "4000:4000"
      - "8443:8443"
    links:
      - mongo
    depends_on:
      - mongo
    networks:
      app_net:
        ipv4_address: 192.17.1.3
    healthcheck:
      # test: ["CMD", "curl", "-k", "https://localhost:8443"]
      # test: ifconfig
      test: curl -k http://192.17.1.3:8443
      # test: curl http://localhost:8443/bundle.js -k -s | grep -C 3 "window.pushNotification"
      interval: 30s
      timeout: 10s
      retries: 3
  mongo:
    image: mongo # pulling on docker-compose up if image not available
    #    volumes: # TODO mongo2.6
    #      - /Users/yuqiuge/Downloads/mongodb-osx-x86_64-2.6.10/data/db:/data/db
    #      - /data/db:/data/db
    ports:
      - "27017:27017"
    networks:
      app_net:
        # static different ip for mongo
        ipv4_address: 192.17.1.2
  protractor:
    build: webapp
    restart: on-failure
    depends_on:
      - server
    links:
      - server
    networks:
      app_net:
        # static different ip for ui test on webapp
        ipv4_address: 192.17.1.4

networks:
  app_net:
    driver: bridge
    driver_opts:
      com.docker.network.enable_ipv6: "false"
    ipam:
      driver: default
      config:
        - subnet: 192.17.1.0/24