繁体   English   中英

在谷歌云构建中的两个容器之间进行通信

[英]Communicate between two containers in Google cloud build

我在 Google 云构建中运行我的 CI/CD 管道。 我的应用程序有webwget容器。 我正在尝试从wget访问web

云构建内部使用cloudbuild桥接网络,同时启动容器作为步骤。 所以我期待这些步骤使用名称进行通信。 但它失败了。

如果我创建自己的 docker bridge netwok,那么它们就会进行通信。

我想知道为什么 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"]

为了了解 cloudbuild 的内部结构,我使用了一些 docker 命令。

调试-cloudbuild.yaml

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-builder) 对我的其他容器(通过 docker-compose 社区构建的容器开始)运行集成测试。

无需在 docker-compose.yaml 上指定任何网络,所有容器都在默认网络 ( https://docs.docker.com/compose/networking/ ) 上启动。 在云构建中,它创建了一个名为cloudbuild_default的新网络,并将我所有的容器都放在那里。 通过我的 docker-compose.yaml 文件强制所有容器加入cloudbuild网络,我能够建立通信并对它们运行测试。

#docker-compose.yaml

networks:
  default:
    external:
      name: cloudbuild

这可能是您的替代配置。 希望能帮助到你

文档

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

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

#docker-compose.yml
app-workspace:
  ...
  network_mode: cloudbuild
db-mysql:
  ...
  network_mode: cloudbuild
...
networks:
  default:
    external:
      name: cloudbuild

或者,如果您使用的是 docker docker run ,请添加选项--network cloudbuild

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

#steps
- id: 'Ping to other container'
  name: gcr.io/cloud-builders/curl
  args: ["app-workspace:your-service-port"]

希望这可以帮助。

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

例如,如果您有一个 Web 服务器侦听容器中的端点 /hello(在端口 8081 上)以进行第一个构建步骤 (step_0)。 您可以通过向http://step_0:8081/hello发出请求,从另一个构建步骤容器向该端点发出请求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM