我使用的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 的新手。这个项目只是为了我自己的理解。很可能我使用了不正确的术语和/或比我想象的更困惑。感激地接受更正。
我使用了两个 docker 镜像:官方 postgres 镜像和我自己的 Go 应用程序和 Dockerfile。使用docker-compose up我得到connection refused错误。
我认为可能存在两个不同的问题:
一,当应用程序尝试连接时,数据库没有运行。
第二,该应用程序只是使用了无效的 IP。
我有应用程序代码应该让数据库有时间启动以解决第一个潜在问题(请参阅下面的代码)。从错误消息来看,我认为我什至没有走那么远。
我有两个服务:db-access(即 Go 应用程序)和 postgres-db。
我曾尝试在应用程序连接字符串中使用这些主机名:
"本地主机",
“postgres-db”(因为它在 docker-compose.yml 中命名),
“0.0.0.0”。
使用postgres-db作为主机名:
应用程序容器正在尝试:拨打 tcp 172.22.0.2:5432。
Postgres 说:侦听 IPv4 地址“0.0.0.0”,端口 5432。
在docker-compose.yml我曾尝试使用这些语句:
depends_on:
- postgres-db
Run Code Online (Sandbox Code Playgroud)
和
links:
- postgres-db
Run Code Online (Sandbox Code Playgroud)
我曾尝试颠倒 docker-compose.yml 中服务的顺序,但它们似乎以相同的顺序启动。
当我分别运行 postgres 容器和 Go 应用程序时,我得到了预期的行为。要单独运行它们,我正在使用这些命令:
docker run --rm --name postgres-db -e POSTGRES_PASSWORD=docker -d -p 5432:5432 -v /Users/ForeignFood/Development/go/src/github.com/skillitzimberg/docker/volumes/postgres:/var/lib/postgresql/data postgres
Run Code Online (Sandbox Code Playgroud)
其次是
go run basicapi
我也可以运行docker-compose …