Docker -compose передать stdout из сервиса в stdin в другом сервисе - PullRequest
0 голосов
/ 07 мая 2020

Я не уверен, что то, что я ищу, возможно или нет ... Я новичок ie в docker -составном мире и я много читал документации и сообщений, но я не смог найти решение.

Мне нужно передать stdout службы, определенной в docker -compose, в stdin другой службы. Таким образом, выходные данные ServiceA будут входными данными ServiceB.

Возможно ли это?

Я вижу функцию stdin_open, но не могу понять, как использовать стандартный вывод другой службы в качестве ввода .

Есть предложения?

Спасибо

1 Ответ

1 голос
/ 07 мая 2020

Вы не можете сделать это в Docker легко.

stdin и stdout процессов контейнера обычно мало используются. Чаще всего stdout получает сообщения журнала, которые можно просмотреть позже, а контейнеры фактически обмениваются данными через сетевые сокеты. (Контейнер обычно запускает Apache, но не grep.)

Docker не имеет собственного кросс-контейнерного конвейера, кроме настройки сети. Если вы docker run ning контейнеры из оболочки, вы можете использовать там обычный канал:

sudo sh -c 'docker run image-a | docker run image-b'

Если целесообразно запускать оба процесса в одном контейнере, вы можете использовать канал оболочки в качестве Основная команда контейнера:

docker run image sh -c 'process_a | process_b'

Другой хакерский подход - использовать такой инструмент, как Netcat, для соединения «stdin» и сетевого порта. Например, рассмотрим «сервер»:

#!/bin/sh
# server.sh
# (Note, this uses busybox nc syntax)
nc -l -p 12345 \
  | cat        \ # <-- a process that reads from stdin
  > out.txt

И соответствующий «клиент»:

#!/bin/sh
# client.sh
cat in.txt        \ # <-- a process that writes to stdout
  | nc "$1" 12345

Создайте из них изображение

FROM busybox
COPY client.sh server.sh /bin/
EXPOSE 12345
WORKDIR /data
CMD ["server.sh"]

Теперь запустите оба контейнера:

docker network create testnet
docker build -t testimg .
echo hello world > in.txt
docker run -d -v $PWD:/data --net testnet --name server testimg \
  server.sh
docker run -d -v $PWD:/data --net testnet --name client testimg \
  client.sh server
docker wait client
docker wait server
cat out.txt

Более надежным путем было бы заключить серверный процесс в простой HTTP-сервер, который принял HTTP-запрос POST по некоторому пути и запустил подпроцесс для обработки запроса; тогда у вас будет один долго работающий серверный процесс, вместо того, чтобы повторно запускать его для каждого запроса. Клиент будет использовать такой инструмент, как curl или любой другой HTTP-клиент.

...