集装箱港口转发

时间:2019-04-30 18:41:10

标签: docker google-cloud-run

我有一个可在端口3000上侦听的二进制文件,但是,Google Cloud Run希望我在$PORT所定义的端口上侦听,该端口默认为8080

有没有一种方法可以使我的容器绑定到8080,然后将传入的请求转发到3000?例如,通过向我的Dockerfile添加一个简短的脚本和一行代码,它将使我的容器在8080上侦听并转发到我的二进制文件。

2 个答案:

答案 0 :(得分:2)

下面的代码未经测试,但总体思路是这样的:

  1. 使用基于外壳的启动脚本
  2. 启用iptables
  3. 将流量从srcPort路由到dstPort
  4. 执行原始二进制文件

在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 "$@"

答案 1 :(得分:0)

如果您可以安装第二个运行程序并沿着主进程启动它,那么请使用以下命令安装并运行socat:

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

这样,socat将绑定到8080端口,并将所有流量发送到您的二进制文件正在侦听的端口3000。

在Cloud Run之外:如果您无法触摸图像或容器,则仍可以在其他容器上运行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是二进制文件的服务名称。