Docker 在Google cloud build中的两个容器之间通信

Docker 在Google cloud build中的两个容器之间通信,docker,google-cloud-platform,google-cloud-build,Docker,Google Cloud Platform,Google Cloud Build,我正在Google cloud build中运行我的CI/CD管道。我的应用程序有web和wget容器。我正试图从wget Cloud build在内部使用cloudbuild桥接网络,同时作为步骤启动容器。因此,我希望这些步骤能够使用名称进行通信。但它失败了 如果我创建了自己的docker桥网络,那么它们将进行通信 我想知道为什么cloudbuild网络没有按预期工作 如果您知道在step容器之间建立通信的任何其他方法,请告诉我 cloudbuild.yaml steps: - name:

我正在Google cloud build中运行我的CI/CD管道。我的应用程序有
web
wget
容器。我正试图从
wget

Cloud build在内部使用
cloudbuild
桥接网络,同时作为步骤启动容器。因此,我希望这些步骤能够使用名称进行通信。但它失败了

如果我创建了自己的docker桥网络,那么它们将进行通信

我想知道为什么cloudbuild网络没有按预期工作

如果您知道在step容器之间建立通信的任何其他方法,请告诉我

cloudbuild.yaml

steps:

- name: 'gcr.io/cloud-builders/docker'
  id: Web server
  args: ["run", "-d", "--name", "mani", "manikantanr/hostname_ip"]

- name: 'gcr.io/cloud-builders/wget'
  id: wget web mani:8000
  args: ["-qO-", "http://mani:8000"]
steps:

- name: 'gcr.io/cloud-builders/docker'
  id: Docker Version
  args: ["version"]

- name: 'gcr.io/cloud-builders/docker'
  id: Docker info
  args: ["info"]

- name: 'gcr.io/cloud-builders/docker'
  id: Docker volume ls
  args: ["volume", "ls"]

- name: 'gcr.io/cloud-builders/docker'
  id: Docker volume inspect homevol
  args: ["volume", "inspect", "homevol"]


- name: 'gcr.io/cloud-builders/docker'
  id: Docker network ls
  args: ["network", "ls"]

- name: 'gcr.io/cloud-builders/docker'
  id: Docker network inspect cloudbuild
  args: ["network", "inspect", "cloudbuild"]

- name: 'gcr.io/cloud-builders/docker'
  id: Docker ps before
  args: ["container", "ls", "--no-trunc"]

- name: 'gcr.io/cloud-builders/docker'
  id: Web server
  args: ["run", "-d", "--name", "mani", "manikantanr/hostname_ip"]
  # waitFor: ['-']

- name: 'gcr.io/cloud-builders/wget'
  id: wget ipinfo
  args: ["-qO-", "https://ipinfo.io"]

- name: 'gcr.io/cloud-builders/docker'
  id: Docker ps after
  args: ["container", "ls", "--no-trunc"]

- name: 'gcr.io/cloud-builders/docker'
  id: Docker inspect mani host network
  args: ["inspect", "mani"]

- name: 'gcr.io/cloud-builders/docker'
  id: Docker alpine ifconfig inside container
  args: ["run", "alpine", "ifconfig"]

- name: 'gcr.io/cloud-builders/wget'
  id: wget mani:8000
  args: ["-qO-", "http://mani:8000"]
为了理解cloudbuild内部,我使用了一些docker命令

debug-cloudbuild.yaml

steps:

- name: 'gcr.io/cloud-builders/docker'
  id: Web server
  args: ["run", "-d", "--name", "mani", "manikantanr/hostname_ip"]

- name: 'gcr.io/cloud-builders/wget'
  id: wget web mani:8000
  args: ["-qO-", "http://mani:8000"]
steps:

- name: 'gcr.io/cloud-builders/docker'
  id: Docker Version
  args: ["version"]

- name: 'gcr.io/cloud-builders/docker'
  id: Docker info
  args: ["info"]

- name: 'gcr.io/cloud-builders/docker'
  id: Docker volume ls
  args: ["volume", "ls"]

- name: 'gcr.io/cloud-builders/docker'
  id: Docker volume inspect homevol
  args: ["volume", "inspect", "homevol"]


- name: 'gcr.io/cloud-builders/docker'
  id: Docker network ls
  args: ["network", "ls"]

- name: 'gcr.io/cloud-builders/docker'
  id: Docker network inspect cloudbuild
  args: ["network", "inspect", "cloudbuild"]

- name: 'gcr.io/cloud-builders/docker'
  id: Docker ps before
  args: ["container", "ls", "--no-trunc"]

- name: 'gcr.io/cloud-builders/docker'
  id: Web server
  args: ["run", "-d", "--name", "mani", "manikantanr/hostname_ip"]
  # waitFor: ['-']

- name: 'gcr.io/cloud-builders/wget'
  id: wget ipinfo
  args: ["-qO-", "https://ipinfo.io"]

- name: 'gcr.io/cloud-builders/docker'
  id: Docker ps after
  args: ["container", "ls", "--no-trunc"]

- name: 'gcr.io/cloud-builders/docker'
  id: Docker inspect mani host network
  args: ["inspect", "mani"]

- name: 'gcr.io/cloud-builders/docker'
  id: Docker alpine ifconfig inside container
  args: ["run", "alpine", "ifconfig"]

- name: 'gcr.io/cloud-builders/wget'
  id: wget mani:8000
  args: ["-qO-", "http://mani:8000"]

我在云构建上设置集成测试时遇到了类似的问题。我试图从另一个构建器(go构建器)对我的其他容器(通过docker compose社区构建的容器启动)运行集成测试

没有在docker-compose.yaml上指定任何网络,所有容器都在默认网络()上启动。在cloud build上,它创建了一个名为cloudbuild\u default的新网络,并将我的所有容器放在那里。通过我的docker-compose.yaml文件强制所有容器加入cloudbuild网络,我能够建立通信并对它们运行测试

#docker-compose.yaml

networks:
  default:
    external:
      name: cloudbuild

这可能是您的另一种配置。希望它有帮助

我做了一个实验,看起来(不做任何特殊设置)您可以使用名称step_x(基于0的编号)在构建步骤容器之间进行通信

例如,如果您有一个web服务器在第一个构建步骤(步骤0)的容器中侦听端点/hello(在端口8081上)。您可以通过向以下地址发出请求,从另一个生成步骤容器向该端点发出请求。

运行每个构建步骤时,其容器都连接到名为cloudbuild的本地Docker网络。这允许构建步骤相互通信并共享数据

您可以使用docker compose和使用
cloudbuild
network,例如:

#docker-compose.yml
app-workspace:
  ...
  network_mode: cloudbuild
db-mysql:
  ...
  network_mode: cloudbuild
...
networks:
  default:
    external:
      name: cloudbuild
#steps
- id: 'Ping to other container'
  name: gcr.io/cloud-builders/curl
  args: ["app-workspace:your-service-port"]
或者,如果您使用的是
docker run
,请添加选项
--网络云构建

之后,您可以按照预期与上一步中定义的其他服务通信。例如:

#docker-compose.yml
app-workspace:
  ...
  network_mode: cloudbuild
db-mysql:
  ...
  network_mode: cloudbuild
...
networks:
  default:
    external:
      name: cloudbuild
#steps
- id: 'Ping to other container'
  name: gcr.io/cloud-builders/curl
  args: ["app-workspace:your-service-port"]

希望这能有所帮助。

我认为Cloud Builder的运行人员非常基础,他们不打算在内部运行web服务器。你为什么要这么做?需要外部服务的单元测试?通常我使用带有外部服务模拟的单元测试。但是这次我有一个用例,我必须用真实的db容器进行测试。所以我在新的docker网络中以分离模式创建了一个
Postgres
OracleDB
s。然后在同一个网络中启动
web
容器与他们进行通信。我正在寻找一种干净的方法来实现这一点,而无需单独的docker网络。我尝试使用
cloudbuild
host
网络启动容器。Cloud build正在启动名为
steps-x
的容器,但无法从其他步骤访问这些容器。您最终做了什么?我也遇到了同样的问题,只是当我自己定义网络时,它甚至不起作用,这是非常令人沮丧的!在OP显示时,您是否仍然能够使用容器名称访问您的服务?例如,就在http://:?我三个月前也试过同样的方法。我也尝试使用容器主机名
步骤x
将一个容器与另一个容器连接起来。但它没有像你说的那样起作用。我不确定我当时做的每件事都是对的。但我通过创建另一个网络进行了同样的测试,并在该网络中开始了我的步骤,然后他们能够进行通信。默认情况下,步骤在名为
cloudbuild
的网络中启动。我尝试在同一网络中启动容器,即使这样也无济于事。我只是做了一个测试,首先运行此步骤:
-name:gcr.io/cloud builders/docker
args:['network','create','cloudbuild net']
然后,如果我通过选项运行该网络中的其他步骤容器:
--network cloudbuild net
我可以让所有步骤容器根据名称彼此对话,您会举个例子吗?我现在正在努力解决这个问题。是的,这是一个回购协议,是由做类似事情的人建立的: