Экспедирование контейнерных портов - PullRequest
2 голосов
/ 30 апреля 2019

У меня есть бинарный файл, который прослушивает порт 3000, однако Google Cloud Run хочет, чтобы я прослушивал порт, определенный как $PORT, по умолчанию 8080.

Есть ли способсделать мой контейнер привязанным к 8080 и затем перенаправить входящие запросы на 3000?например, добавив короткий скрипт и одну строку в мой Dockerfile, он заставит мой контейнер прослушивать 8080 и переслать мой двоичный файл.

Ответы [ 2 ]

2 голосов
/ 30 апреля 2019

Код ниже не протестирован, но общая идея такова:

  1. Использовать сценарий запуска на основе оболочки
  2. Включить iptables
  3. Направление трафика из srcPort в dstPort
  4. Exec оригинальный двоичный файл

В Dockerfile замените ENTRYPOINT сценарием запуска:

FROM debian:9 # or another container that has iptables available
RUN apt-get install iptables
EXPOSE 8080
ENTRYPOINT /bin/startup.sh /bin/original

А затем напишите сценарий запуска, который включает iptables и перенаправляет входящий трафик на 8080–3000 внутри контейнера:

#!/usr/bin/env bash
set -e

sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/g' /etc/sysctl.conf
sysctl -p
systemctl start iptables

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j REDIRECT --to-port 3000
iptables -t nat -A PREROUTING -i eth0 -p udp --dport 8080 -j REDIRECT --to-port 3000


unshift 
exec "$@"
0 голосов
/ 01 мая 2019

Если вы можете установить запуск второго процесса и запустить его вместе с основным процессом, то установите и запустите socat с помощью следующей команды:

socat tcp-listen:8080,fork,reuseaddr tcp-connect:localhost:3000

Таким образом socat свяжется с портом 8080 и отправит весь трафик на порт 3000, где слушает ваш двоичный файл.

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

version: '3.5'
services:
  proxy:
    image: alpine/socat:1.0.3
    command: tcp-listen:8080,fork,reuseaddr tcp-connect:myservice:3000
    networks:
      - mynet
networks:
  mynet:
    external: true

Где mynet - сеть, в которой работает ваш двоичный файл, а myservice - имя службы вашего двоичного файла.

...