在Google Cloud构建中的两个容器之间进行通信

时间:2018-08-27 20:34:57

标签: docker google-cloud-platform google-cloud-build

我正在Google云构建中运行CI / CD管道。我的应用程序包含webwget容器。我正在尝试从webwget

在启动容器作为步骤时,云构建内部使用cloudbuild网桥网络。因此,我期望这些步骤能够使用名称进行通信。但是它失败了。

如果我创建自己的docker bridge netwok,则他们进行通信。

我想知道为什么cloudbuild网络无法按预期工作。

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

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命令。

debug-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"]

3 个答案:

答案 0 :(得分:2)

我在建立云构建集成测试时遇到了类似的问题。我试图从另一个构建器(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

这可能是您的替代配置。希望对您有帮助

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

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

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

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

希望这会有所帮助。