在 docker 容器内使用带有 ssl 的自托管(Jetty)元数据库时出错

Error when using selfhosted (Jetty) Metabase with ssl inside docker container

我正在尝试在 docker 容器 运行 启用 ssl 的情况下设置自托管(Jetty)元数据库。

首先,我使用 certbot, than converted to keystore.jks using this gist.

创建了 fullchain.pemprivkey.pem

然后创建一个将用于 --env-file docker 标志的 .env 文件:

MB_DB_FILE=/metabase/metabase.db
MB_JETTY_SSL=true
MB_JETTY_SSL_PORT=443
MB_JETTY_SSL_KEYSTORE=./keystore.jks
MB_JETTY_SSL_KEYSTORE_PASSWORD=my-pass

并尝试 运行:

docker run -p 80:3000 -v ~/metabase:/metabase --env-file "./prod.env" --name metabase metabase/metabase

但是我得到了以下错误:

ERROR metabase.core :: Metabase Initialization FAILED
java.net.SocketException: Permission denied
    at sun.nio.ch.Net.bind0(Native Method) ~[?:?]
    at sun.nio.ch.Net.bind(Unknown Source) ~[?:?]
    at sun.nio.ch.Net.bind(Unknown Source) ~[?:?]
    at sun.nio.ch.ServerSocketChannelImpl.bind(Unknown Source) ~[?:?]
    at sun.nio.ch.ServerSocketAdaptor.bind(Unknown Source) ~[?:?]
    at org.eclipse.jetty.server.ServerConnector.openAcceptChannel(ServerConnector.java:345) ~[metabase.jar:?]
    at org.eclipse.jetty.server.ServerConnector.open(ServerConnector.java:310) ~[metabase.jar:?]
    at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:80) ~[metabase.jar:?]

通过将 SSL_PORT 更改为 8443 解决,因此新的 env 文件如下所示:

MB_DB_FILE=/metabase/metabase.db
MB_JETTY_SSL=true
MB_JETTY_SSL_PORT=8443
MB_JETTY_SSL_KEYSTORE=./keystore.jks
MB_JETTY_SSL_KEYSTORE_PASSWORD=my-pass

删除了旧容器并使用上面的 env 文件启动了一个新容器,但现在我遇到了这个错误:

ERROR metabase.core :: Metabase Initialization FAILED
java.lang.IllegalStateException: /"./keystore.jks" is not a valid keystore

我已经使用 this 仔细检查了我的 .jks 文件是否有效。确实如此。

我的问题是:

  1. 为什么我不能 运行 在 443
  2. 为什么我的密钥库无效?

编辑 1:

跟进 Joakim 的建议:

改为绝对路径

MB_DB_FILE=/metabase-prod-data/metabase.db
MB_JETTY_SSL=true
MB_JETTY_SSL_PORT=8443
MB_JETTY_SSL_KEYSTORE=/root/services/metabase/setup/keystore.jks
MB_JETTY_SSL_KEYSTORE_PASSWORD=my-pass

遇到这个错误:

ERROR metabase.core :: Metabase Initialization FAILED
java.lang.IllegalStateException: /root/services/metabase/setup/keystore.jks is not a valid keystore

443 是大多数 OS 上的受限端口,需要 root/superuser/admin 权限才能绑定到它。

找不到您的密钥库,该路径无效。
错误只是令人困惑。

您在

的配置
MB_JETTY_SSL_KEYSTORE=./keystore.jks

尝试将其设为绝对路径,因为元数据库显然只是将您提供的内容添加到其他路径的末尾 /

@Joakim 回答了为什么不使用端口 443

我在元数据库初始化时也遇到了这个问题。 我遇到的错误是无法在 docker 容器内访问主机上的密钥库文件。

我使用了docker-compose yml 文件。您也可以搜索基于终端的方式。

我通过使用卷属性在具有证书的主机上添加文件夹使其可访问。

metabase:
   ...
    env_file:
      - ./config/metabase.env
    volumes:
      - <LOCAL_PATH>:<CONTAINER_PATH>

环境路径内:

MB_JETTY_SSL_KEYSTORE:<CONTAINER_PATH>/keystore.jks