我有一个 Docker 容器,需要使用 URL 从 Amazon S3(云存储)访问文件。
代码很好,经过测试,不在 Docker 容器内时也可以在本地运行。但是,一旦在容器内运行,我就会不断收到以下错误:
[tcp @ 0x60636c0] Failed to resolve hostname xxxddd999.s3.amazonaws.com: Name or service not known
该错误来自一段需要从完整 AWS S3 位置 URL 读取文件的代码。但它失败了,因为它无法解析 URL。
制作/运行容器的命令是:
docker run --restart unless-stopped -p 4545:4545 --name fileprocessor fileprocessor:stage
它从图像
fileprocessor:stage
创建容器 fileprocessor
并公开要运行的端口 4545
。我尝试在命令中添加 --net=host
标志,但这没有用,并且会阻止端口暴露。
我正在使用
nginx
运行它(目前在 Windows 上,但会将其移动到 Ubuntu 服务器上进行生产)。我想我必须在 nginx.conf
文件中做一些事情,但无法弄清楚。执行以下操作无效:
location /xxxddd999.s3.amazonaws.com/ {
proxy_pass http://localhost;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
当您位于容器内并且不需要设置网络配置时,您将必须使用
0.0.0.0
作为 IP 而不是 localhost 来联系主机。因为 localhost 指的是 fileprocessor
容器,而该容器无权访问端口 80
location /xxxddd999.s3.amazonaws.com/ {
proxy_pass http://0.0.0.0:80;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
请注意,
/xxxddd999.s3.amazonaws.com/
应该是路由(或文件)而不是外部主机名。
只有您的脚本(php、nodeJS)才会使用正确的 SDK 联系 AWS-S3