在 circleci 的 docker 执行器中使用 docker-compose 进行联网
Networking using docker-compose in docker executor in circleci
我猜这是一个circleci问题。
我对 circleci 很满意,但现在我 运行 遇到了问题,我不知道自己做错了什么。
也许这是一件很简单的事情,但我没有看到它。
简而言之
我无法让容器在 circleci 上相互通信。
问题
基本上我想做的是启动一个 server 容器和一个 client 容器,然后让它们相互通信。
我在这里创建了一个最小的例子:https://github.com/mRcSchwering/circleci-integration-test
README.md
基本上解释了期望的结果。
我有一个 .circleci/config.yml
这样的:
version: 2
jobs:
build:
docker:
- image: docker:18.03.0-ce-git
steps:
- checkout
- setup_remote_docker
- run:
name: Install docker-compose
command: |
apk --update add py2-pip
/usr/bin/pip2 install docker-compose
docker-compose --version
- run:
name: Start Container
command: |
docker-compose up -d
docker-compose ps
- run:
name: Let client talk to server
command: |
docker-compose run client psql -h server -p 5432 -U postgres -c "\l"
在 docker 容器中,安装了 docker-compose
,然后用于启动 server
和 client
(此处为 postgres)。在最后一步中,我告诉 client
查询 server
。但是,它找不到 server
:
#!/bin/sh -eo pipefail
docker-compose run client psql -h server -p 5432 -U postgres -c "\l"
Starting project_server_1 ...
^@^@psql: could not connect to server: Connection refused
Is the server running on host "server" (172.18.0.2) and accepting
TCP/IP connections on port 5432?
Exited with code 2
文件
docker-compose.yml
看起来像这样
version: '2'
services:
server:
image: postgres:9.5.12-alpine
networks:
- internal
expose:
- '5432'
client:
build:
context: .
networks:
- internal
depends_on:
- server
networks:
internal:
driver: bridge
其中 client
是从这样的 docker 文件构建的
FROM alpine:3.7
RUN apk --no-cache add postgresql-client && rm -rf /var/cache/apk/*
备注
如果我在 Linux 上重复所有内容(也使用 docker-in-docker),它会起作用。
但我想有些东西在 circleci 上的工作方式完全不同。
我发现有人提到在 circleci 网络上和绑定安装可能很棘手,但我没有找到任何可以帮助我的东西。
有这个 doc 但我想我已经在这样做了。
然后是 this project,有人似乎在 circleci 上成功地做了同样的事情。
但是我不知道那里有什么不同...
无论如何,我非常感谢您的帮助。到目前为止我已经放弃了。
最佳
马克
好的,与此同时我(不,实际上是来自 circleci 论坛的 halfer)注意到 docker-compose run client psql -h server -p 5432 -U postgres -c "\l"
在服务器启动之前是 运行和 运行宁。 docker-compose up -d
之后的简单 sleep 5
解决了问题。
我猜这是一个circleci问题。
我对 circleci 很满意,但现在我 运行 遇到了问题,我不知道自己做错了什么。 也许这是一件很简单的事情,但我没有看到它。
简而言之
我无法让容器在 circleci 上相互通信。
问题
基本上我想做的是启动一个 server 容器和一个 client 容器,然后让它们相互通信。 我在这里创建了一个最小的例子:https://github.com/mRcSchwering/circleci-integration-test
README.md
基本上解释了期望的结果。
我有一个 .circleci/config.yml
这样的:
version: 2
jobs:
build:
docker:
- image: docker:18.03.0-ce-git
steps:
- checkout
- setup_remote_docker
- run:
name: Install docker-compose
command: |
apk --update add py2-pip
/usr/bin/pip2 install docker-compose
docker-compose --version
- run:
name: Start Container
command: |
docker-compose up -d
docker-compose ps
- run:
name: Let client talk to server
command: |
docker-compose run client psql -h server -p 5432 -U postgres -c "\l"
在 docker 容器中,安装了 docker-compose
,然后用于启动 server
和 client
(此处为 postgres)。在最后一步中,我告诉 client
查询 server
。但是,它找不到 server
:
#!/bin/sh -eo pipefail
docker-compose run client psql -h server -p 5432 -U postgres -c "\l"
Starting project_server_1 ...
^@^@psql: could not connect to server: Connection refused
Is the server running on host "server" (172.18.0.2) and accepting
TCP/IP connections on port 5432?
Exited with code 2
文件
docker-compose.yml
看起来像这样
version: '2'
services:
server:
image: postgres:9.5.12-alpine
networks:
- internal
expose:
- '5432'
client:
build:
context: .
networks:
- internal
depends_on:
- server
networks:
internal:
driver: bridge
其中 client
是从这样的 docker 文件构建的
FROM alpine:3.7
RUN apk --no-cache add postgresql-client && rm -rf /var/cache/apk/*
备注
如果我在 Linux 上重复所有内容(也使用 docker-in-docker),它会起作用。 但我想有些东西在 circleci 上的工作方式完全不同。 我发现有人提到在 circleci 网络上和绑定安装可能很棘手,但我没有找到任何可以帮助我的东西。 有这个 doc 但我想我已经在这样做了。 然后是 this project,有人似乎在 circleci 上成功地做了同样的事情。 但是我不知道那里有什么不同...
无论如何,我非常感谢您的帮助。到目前为止我已经放弃了。
最佳 马克
好的,与此同时我(不,实际上是来自 circleci 论坛的 halfer)注意到 docker-compose run client psql -h server -p 5432 -U postgres -c "\l"
在服务器启动之前是 运行和 运行宁。 docker-compose up -d
之后的简单 sleep 5
解决了问题。