Вы не можете сделать это в 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-клиент.