为 localhost 生成 MinIO presignedUrls,而不是 docker 服务名称

问题描述 投票:0回答:2

我有一个带有 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

到目前为止我尝试过的(但没有成功):

  • 主机名的简单字符串替换 => 哈希值仅对创建 url 的主机名有效
  • 将Minio.Client中的endPoint设置为localhost。 => api 无法再连接到 minIO。
  • 使用 localhost 设置环境变量 MINIO_SERVER_URL、MINIO_BROWSER_REDIRECT_URL 和 MINIO_DOMAIN => 相同错误

解决方法

一个简单的解决方法是手动将 docker 服务名称 minio 重定向到 127.0.0.1。但我正在寻找没有此解决方法的解决方案。

node.js docker docker-compose localhost minio
2个回答
2
投票

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

注意: 但是,为了使其可供其他人通过网络访问,主机条目必须是可解析的


0
投票

我的答案并不完全是你想要的解决方案,但它解决了我的问题。

我想做你想做的同样的事情,因为当我在 minio 中检索视频的 url 时,带有 docekr 服务名称的 url 在本地浏览器上不起作用。

我找不到使其成为本地主机的方法,但我意识到该服务名称仅适用于 docker,当然该 url 在本地不起作用。

解决方案是将minioClient的端点设置为如下:

endPoint: 'host.docker.internal'

该 url 现在适用于 docker 和本地计算机。

© www.soinside.com 2019 - 2024. All rights reserved.