У меня есть два docker образа: производитель и очередь RabbitMQ. Моя цель - заставить производителя (Python) вставлять записи в очередь. Затем я хочу позвонить docker-compose up
и посмотреть, как продюсер добавляет вещи в очередь.
Итак, я не самый яркий мелок в коробке, и я был бы очень признателен, если бы кто-то мог указать на мне, почему все работает не так, как я планировал. Мой производитель - это простые 2 файла в каталоге ./producer
. Файл докеров для этого каталога выглядит так:
FROM ubuntu:latest
ENV DEBIAN_FRONTEND=noninteractive
# Prepare to install 3.7 + GDAL libraries
RUN apt-get update --fix-missing
RUN apt-get install -y software-properties-common apt-utils
RUN add-apt-repository ppa:ubuntugis/ppa
RUN add-apt-repository ppa:deadsnakes/ppa
RUN apt-get update --fix-missing
# Install the packages for GDAL
RUN apt-get install libgdal-dev gdal-bin -y
# Install the packages for python
RUN apt-get install python3.7 python3-pip python3.7-dev -y
RUN python3.7 -m pip install pika
COPY ./example.py example.py
CMD [ "/bin/bash", "-c \"python3.7 example.py\"" ]
Я заменил последнюю строку на ENTRYPOINT
, CMD
, различные версии /bin/bash
, python3
, python3.7
. Запуск docker build -t blah && docker run --rm blah
приводит к ожидаемому мной поведению (не удается подключиться к очереди, потому что не запущено исключение).
В каталоге, содержащем ./producer
, у меня есть файл docker-compose.yml
, который выглядит так :
version: "3.3"
services:
# RabbitMQ that connects the backend to the frontend
queue:
image: rabbitmq:3-management
expose:
# The standard AMQP protocol port
- 5672
ports:
# HTTP management UI
- '15672:15672'
environment:
RABBITMQ_DEFAULT_USER: "guest"
RABBITMQ_DEFAULT_PASS: "guest"
networks:
rakan:
ipv4_address: 172.16.238.10
deploy:
replicas: 1
update_config:
parallelism: 1
delay: 10s
restart_policy:
condition: on-failure
delay: 10s
max_attempts: 3
window: 120s
healthcheck:
test: [ "CMD", "nc", "-z", "localhost", "5672" ]
interval: 5s
timeout: 15s
retries: 1
producer:
depends_on:
- queue
build:
context: ./producer
dockerfile: dockerfile
# entrypoint: "/bin/bash -c \"python example.py\""
expose:
- "5672"
networks:
rakan:
ipv4_address: 172.16.238.11
links:
- "queue"
networks:
- rakan
networks:
rakan:
ipam:
driver: default
config:
- subnet: "172.16.238.0/24"
Что ужасно расстраивает, так это то, что docker-compose up
больше не выполняет команду в ./producer/dockerfile
. Он запустит очередь, но он будет игнорировать мои желаемые команды, говоря:
Attaching to toyexample_queue_1, toyexample_producer_1
toyexample_producer_1 exited with code 0
... All the logs of the RabbitMQ ...
Почему, почему это происходит? Почему он не ведет себя так же, когда я выполнил docker run
? Любая помощь будет очень оценена.
То, что я пробовал:
- Добавление
entrypoint
к docker-compose.yml
формы python3.7 example.py
, bin/bash python3.7 example.py
, bash python example.py
. Все будет завершено с кодом ошибки 127
, утверждая, что python
или python3.7
является нераспознанной командой. - Добавление
cmd
к docker-compose.yml
с теми же точными результатами, что и последняя точка маркера - Замена
CMD
на ENTRYPOINT
в ./producer/dockerfile
- Пробуем разные варианты
python
, python3.7
в docker-compose.yml
и dockerfile
.
То, что я не знаю, актуально, но может помочь
- Я использую docker v19.03.8 на windows 10 (процессор AMD Ryzen)
- 0 других контейнеров запущено
docker-compose down
, docker network/container/image prune
- это все команды, которые я пробовал много во время этого epi c путешествие - Код в
example.py
выглядит так:
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters('172.16.238.10'))
channel = connection.channel()
for i in range(100):
# make a lot of noise
channel.queue_declare(queue=f'hello_{i}')
channel.basic_publish(exchange='',
routing_key='hello_{i}',
body='Hello World!')
print(f" [x] Sent 'Hello World!' to {i}")
connection.close()
- Обязательно: «Это не домашнее задание, я не пытаюсь обмануть и т. Д. c»