我使用的RabbitMQ并从一个简单的Python样品在这里 一起泊坞窗-撰写.我的问题是我需要等待rabbitmq完全启动.从我到目前为止搜索到的,我不知道如何等待容器x(在我的情况下是工人)直到y(rabbitmq)开始.
我找到了这个博文,他检查其他主机是否在线.我还发现了这个docker命令:
等待
用法:docker等CONTAINER [CONTAINER ...]
阻止,直到容器停止,然后打印其退出代码.
等待容器停止可能不是我想要的但如果是,是否可以在docker-compose.yml中使用该命令?到目前为止,我的解决方案是等待几秒钟并检查端口,但这是实现此目的的方法吗?如果我不等,我会收到错误.
泊坞窗,compose.yml
worker:
build: myapp/.
volumes:
- myapp/.:/usr/src/app:ro
links:
- rabbitmq
rabbitmq:
image: rabbitmq:3-management
Run Code Online (Sandbox Code Playgroud)
python hello sample(rabbit.py):
import pika
import time
import socket
pingcounter = 0
isreachable = False
while isreachable is False and pingcounter < 5:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect(('rabbitmq', 5672))
isreachable = True
except socket.error as e:
time.sleep(2)
pingcounter += 1
s.close()
if isreachable:
connection = pika.BlockingConnection(pika.ConnectionParameters(
host="rabbitmq"))
channel = connection.channel()
channel.queue_declare(queue='hello')
channel.basic_publish(exchange='', …Run Code Online (Sandbox Code Playgroud) 根据Docker Compose的撰写文件文档:
depends_on - 服务之间的快速依赖性.links- 链接到另一个服务中的容器,并以与depends_on相同的方式表达服务之间的依赖关系.我不明白链接到其他容器的目的,所以两个选项之间的差异对我来说似乎仍然很难.
如果有一个例子会更容易,但我找不到任何例子.
我注意到,当我将容器B与容器A链接时,容器B将在容器A的shell内"ping".
我ping B在容器A里跑了bash,得到了这样的结果(仅供参考,来自互联网的图片)
在容器内运行服务时,让我们说命令是mongodb
docker run -d myimage
Run Code Online (Sandbox Code Playgroud)
将立即退出,并返回容器ID.在我的CI脚本中,我在运行mongo容器后立即运行客户端来测试mongodb连接.问题是:客户端无法连接,因为服务尚未启动.除了sleep 10在我的脚本中添加一个大的,我没有看到任何等待容器启动和运行的选项.
Docker有一个wait在这种情况下不起作用的命令,因为容器不存在.这是码头工人的限制吗?谢谢
我正在使用docker-compose使用docker服务,并且我有一个依赖于花药的服务。
我使用了depends_on密钥,但是具有依赖项的服务在依赖服务完全启动之前启动。
version: '3'
services:
KeyManager:
image: cjrutherford/keymanager
deploy:
replicas: 1
ports:
- '3220:3220'
networks:
- privnet
YellowDiamond:
image: cjrutherford/server
depends_on:
- KeyManager
deploy:
replicas: 1
ports:
- '3000:3000'
networks:
- privnet
- web
networks:
privnet:
internal: true
web:
Run Code Online (Sandbox Code Playgroud)
这两个都是节点应用程序,要求密钥管理器在服务器启动之前运行以接受请求。我可以添加超时吗?或在应用程序中发送触发器?从经理那里获取钥匙还为时过早。
我当前的docker-compose.yml-
# This docker-compose file uses '.env' file present in the current directory,
# for database credentials. If you want to change the credentials please
# change the data in '.env'.
# '.env' file might be hidden as dot files are hidden please unhide to see it.
# Know more about '.env' file: https://docs.docker.com/compose/env-file/
version: '3'
services:
postgresdb:
image: postgres:9.5
environment:
POSTGRES_USER: ${ENV_POSTGRES_USER}
POSTGRES_PASSWORD: ${ENV_POSTGRES_PASSWORD}
POSTGRES_DB: ${ENV_POSTGRES_DB}
volumes:
- "../app/volumes/postgres/data:/var/lib/postgresql/data"
# This is python service. It uses python 3.6 as …Run Code Online (Sandbox Code Playgroud)