我有一个在 port 上侦听的二进制文件3000
,但是,Google Cloud Run 希望我侦听由 定义的端口$PORT
,默认为8080
.
有没有办法让我的容器绑定到 8080,然后将传入的请求转发到 3000?例如,通过在 my 中添加一个简短的脚本和一行Dockerfile
,它会使我的容器在 8080 上侦听并转发到我的二进制文件。
我有一个在 port 上侦听的二进制文件3000
,但是,Google Cloud Run 希望我侦听由 定义的端口$PORT
,默认为8080
.
有没有办法让我的容器绑定到 8080,然后将传入的请求转发到 3000?例如,通过在 my 中添加一个简短的脚本和一行Dockerfile
,它会使我的容器在 8080 上侦听并转发到我的二进制文件。
下面的代码未经测试,但总体思路是这样的:
在 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 "$@"
如果您可以安装运行第二个进程并沿主进程启动它,则使用以下命令安装并运行 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
的服务名称。