我认为我正面临着与码头组成的竞争条件。
我有一个需要连接到另一个服务(A)的服务(B),它们都是从同一个docker compose文件运行的。与他们一起,我有另一个服务(C),它是最后一个服务,它也是List<RRProcess> noDuplicates = pSorted
.GroupBy(i => i.pID)
.Select(group => (RRProcess)group.First().Clone())
.ToList();
。
我看到的是,如果我启用C服务(在docker compose文件中),那么服务B停止并停止工作,而如果我只运行A和B,则启动就可以了。这对我来说似乎是码头工人的竞争条件,有人可以告诉我该做什么吗?
PS:我的服务C是node-red的构建(在docker中使用npm安装),因此它本身不是操作系统,这限制了我使用一些可用的docker解决方案。
此致
提前致谢,
编辑:我的docker-compose
links
答案 0 :(得分:0)
正如@hardillb在评论中指出的那样,看到docker-compose.yml文件会很高兴,但我猜你需要使用depends_on选项,如下所示:
version: '2'
services:
mysql-int:
image: mysql:5.6.27
ports:
- 3306:3306
container_name: mysql
test-int:
build: ../test
depends_on:
- mysql-int
container_name: test
答案 1 :(得分:0)
depends_on在这里不起作用,它只会给你“容器刚开始的pid1” - 这并不意味着,例如,你的容器将启动并运行其套接字,假设mysql-server已准备好进行连接。
一般模式是,假设我们有db作为mysql容器,app作为应用程序,而app需要首先启动db(完全)
version: '2'
services:
db:
image: mysql
app:
image: me/myapp
然后,您的应用图片的入口点会在脚本顶部执行此操作:
#!/bin/bash
# this script does only exist to wait for the database before we fire up tomcat / standalone
RET=1
echo "Waiting for database"
while [[ RET -ne 0 ]]; do
sleep 1;
if [ -z "${db_password}" ]; then
mysql -h $db_host -u $db_user -e "select 1" > /dev/null 2>&1; RET=$?
else
mysql -h $db_host -u $db_user -p$db_password -e "select 1" > /dev/null 2>&1; RET=$?
fi
done
将host / db / port调整为mysql端口。
通过使用等待它的tcp套接字连接测试,您也可以采用更通用的方法:https://github.com/vishnubob/wait-for-it
您可以在docker docs中找到一般主题:https://docs.docker.com/compose/startup-order/