2017-08-30 43 views
3

我有一個春天的應用程序。其中一種方法使用webhdfs從hdfs中讀取文件。當我在想法中測試它時,它會起作用。但是,在我構建項目並在本地或在連接到hdfs的服務器上的虛擬機上部署Docker鏡像之後,我可以看到。docker kerberos webhdfs AuthenticationException:未授權

AuthenticationException: Unauthorized 

在我的本地機器,我必須用

kinit 

爲autentification regulary初始化令牌。如果我不這樣做,我會得到同樣的錯誤。我在服務器上測試了沒有docker的應用程序,它也可以工作。我認爲,碼頭形象沒有看到令牌。但我不知道該怎麼做。

Kerberos用於安全性。

有什麼建議嗎?

回答

0

Okey。我做的。有幾個問題,但這是最終變種的外觀。

我的碼頭。 krb5.conf和keytab與我的docker文件位於同一個文件夾中。當我建立它們加入到容器中,並在入口點的項目,我用

-Djava.security.krb5.conf 

提供krb5的位置。還有一些選項用於調試+我連接mongo。

FROM java:8 
ADD report.jar report.jar 
ADD krb5.conf /etc/krb5.conf 
ADD evkuzmin.keytab /etc/evkuzmin.keytab 
RUN sh -c 'touch report.jar' 
ENTRYPOINT ["java","-Dspring.data.mongodb.uri=mongodb://audpro_mongo/report","-Djavax.net.debug=all","-Dsun.security.spnego.debug=true","-Dsun.security.krb5.debug=true","-Djava.security.krb5.conf=/etc/krb5.conf","-jar","/report.jar"] 

然後我用KerberosRestTemplate連接到webhdfs

public String getReportJSON() throws URISyntaxException { 
    KerberosRestTemplate restTemplate = new 
     KerberosRestTemplate("/etc/evkuzmin.keytab", "[email protected]"); 
    URI uri = new URI("http" + "://" + host + ":" + port + "/webhdfs/v1" + path + "?op=OPEN"); 
    String json = restTemplate.getForObject(uri, String.class); 
    return json; 
    } 

如果你想運行,而不泊塢窗的應用,只是建立它和密鑰表添加到同一方向的罐子。然後更改/etc/evkuzmin.keytab,以便它指向新的位置。