我们正在使用微服务方法来构建我们的产品。我们正在使用一些项目,每个项目都使用docker-compose来运行。问题是在开发环境中,如果我们想要更改多个项目中的代码并测试开发的代码,我们必须单独运行项目并手动将它们链接在一起。
现在我们要创建一个开发工具包,它可以克隆项目并将它们一起运行并处理链接。 docker-compose可以处理多个docker-compose文件吗?如果没有,有没有足够的工具为我们这样做?或者我们的目标是否有任何推荐的方法?
编辑:例如,我们有两个项目:PROJECT_A和PROJECT_B。每个都有自己的docker-compose.yml,每个都需要postgresql来运行。我们在PROJECT_A中有这样的docker-compose.yml:
db:
image: postgres:9.4
ports:
- "5432"
project_a:
build: .
command: python2.7 main.py
links:
- db
我们在PROJECT_B中有这样的docker-compose.yml:
db:
image: postgres:9.4
ports:
- "5432"
project_b:
build: .
command: python2.7 main.py
links:
- db
每个项目都可以单独运行并且运行正常。但是如果我们想要改变PROJECT_A和PROJECT_B之间的api,我们需要运行这两个项目并将它们链接在一起来测试我们的代码。现在我们要编写一个开发工具包项目,该项目可以运行这两个项目并在需要时链接它们。这样做的最佳方法是什么?
答案 0 :(得分:7)
您可以使用docker-compose
的{{3}}功能,通过组合多个文件中的服务来实现此目的。将项目放在一个定义明确的位置,并使用相对路径引用它们:
../
├── foo/
│ └── docker-compose.yml
└── bar/
└── docker-compose.yml
base:
build: .
foo:
extends:
service: base
links:
- db
db:
image: postgres:9
如果你想自己测试这个项目,你可以这样做:
sudo docker-compose up -d foo
创建foo_foo_1
foo:
extends:
file: ../foo/docker-compose.yml
service: base
links:
- db
bar:
build: .
extends:
service: base
links:
- db
- foo
db:
image: postgres:9
现在,您可以使用以下方法测试这两项服务:
sudo docker-compose up -d bar
创建bar_foo_1
创建bar_bar_1
答案 1 :(得分:3)
对你的问题我不是100%肯定所以这将是一个广泛的答案。
1)如果它在同一台计算机或服务器群集上运行,则所有内容都可以在同一个撰写文件中。
#proxy
haproxy:
image: haproxy:latest
ports:
- 80:80
#setup 1
ubuntu_1:
image: ubuntu
links:
- db_1:mysql
ports:
- 80
db1:
image: ubuntu
environment:
MYSQL_ROOT_PASSWORD: 123
#setup 2
ubuntu_2:
image: ubuntu
links:
- db_2:mysql
ports:
- 80
db2:
image: ubuntu
environment:
MYSQL_ROOT_PASSWORD: 123
也可以组合几个yml文件,如
$docker-compose -f [File A].yml -f [File B].yml up -d
2)构建中的每个容器都可以用
$docker-compose stop/start/build/ ubuntu_1
3)使用$docker-compose build
只会重建已完成更改的位置。
以下是可能有用的更多信息 https://docs.docker.com/compose/extends/#extending-services
如果以上都不正确,请提供构建示例。
答案 2 :(得分:1)
对于遇到同样问题的其他人来说,这是我们的方法:
现在我们的每个项目都有一个docker-compose,可以独立运行。我们还有另一个名为“开发套件”的项目。哪些克隆需要项目并将它们存储在目录中。我们可以使用类似命令运行我们的项目:
python controller.py --run projectA projectB
它使用docker-compose up命令运行每个项目。然后,当所有项目都启动并运行时,它会开始将所有其他项目主docker的IP添加到其他项目中,方法是使用以下命令将它们添加到/ etc / hosts ips:
# getting contaier id of projectA and projectB
CIDA = commands.getoutput("docker-compose ps -q %s" % projectA)
CIDB = commands.getoutput("docker-compose ps -q %s" % projectB)
# getting ip of container projectA
IPA = commands.getoutput("docker inspect --format '{{ .NetworkSettings.IPAddress }}' %s" % CIDA)
现在,要将projectB的请求发送到projectA,我们只需将projectA IP定义为" projectA"在projectB的设置中。