我有一个带有 node.js api 的项目设置和带有 docker compose 的 minio 服务:
app:
image: node
# ...
minio:
image: minio/minio
volumes:
- ./data:/data
ports:
- '9000:9000'
- '9001:9001'
command: server --console-address ":9001" /data
在我的节点脚本中,我运行以下代码:
import * as Minio from 'minio';
const minioClient = new Minio.Client({
endPoint: 'minio',
port: 9000,
useSSL: false,
accessKey: 'access',
secretKey: 'secret',
});
minioClient.presignedUrl(
'GET',
'my-bucket',
'test.txt',
function (err, presignedUrl) {
if (err) {
return console.error(err);
}
console.log(presignedUrl);
}
);
结果是这样的 url:
http://minio:9000/files-c000000000000000000000000/test.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=u7gk0nycOepyDAWV%2F20230314%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20230314T131440Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=315c9184a40009ff5af0815e597214b6422650e240d186979295c5188cbb2885
在我的开发环境中,我需要使用 localhost 而不是 minio 的 url,如下所示:\
http://localhost:9000/files-c000000000000000000000000/test1678799680428.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=u7gk0nycOepyDAWV%2F20230314%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20230314T131440Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=315c9184a40009ff5af0815e597214b6422650e240d186979295c5188cbb2885
到目前为止我尝试过的(但没有成功):
解决方法
一个简单的解决方法是手动将 docker 服务名称 minio 重定向到 127.0.0.1。但我正在寻找没有此解决方法的解决方案。
MINIO_SERVER_URL
必须设置主机名指向 API 端口。
MINIO_SERVER_URL: http://s3-api-minio:9010
还要检查主机文件中的地址解析
cat /etc/hosts
127.0.1.1 s3-console-minio s3-api-minio
这将显示共享网址中设置的名称。 此时您可以使用curl并在主机内进行验证。
结果示例:
http://s3-api-minio:9010/docker-bucket/test_scroll_tabs.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=DUKZ37YDZ4HDO404OUX1%2F20230315%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20230315T160705Z&X-Amz-Expires=604800&X-Amz-Security-Token=eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhY2Nlc3NLZXkiOiJEVUtaMzdZRFo0SERPNDA0T1VYMSIsImV4cCI6MTY3ODkzODgwOCwicGFyZW50IjoibWluaW8ifQ.r36Y_lohR_R0KSO8EXbKLMO9OWfFxliXvFT3FNqEtfOhXMYgCHQUmUoJu-Z0H8tyeK0ostXyqONpvgufmgWH4A&X-Amz-SignedHeaders=host&versionId=null&X-Amz-Signature=3ccf8200900dd1c9a0fcfd04851748cf10916e909f0461ba08b3231079acab79
注意: 但是,为了使其可供其他人通过网络访问,主机条目必须是可解析的
我的答案并不完全是你想要的解决方案,但它解决了我的问题。
我想做你想做的同样的事情,因为当我在 minio 中检索视频的 url 时,带有 docekr 服务名称的 url 在本地浏览器上不起作用。
我找不到使其成为本地主机的方法,但我意识到该服务名称仅适用于 docker,当然该 url 在本地不起作用。
解决方案是将minioClient的端点设置为如下:
endPoint: 'host.docker.internal'
该 url 现在适用于 docker 和本地计算机。