【问题标题】:Kubernetes - Docker Folder permissionKubernetes - Docker 文件夹权限
【发布时间】:2018-06-25 23:54:51
【问题描述】:

我有一个已部署到 kubernetes 中的 docker 映像。

docker文件如下。

FROM alpine/jdk1.8:latest
RUN mkdir -p /opt/test/app
COPY app.war /opt/test/app/app.war

CMD java -jar /opt/test/app/app.war

此应用程序使用休眠并在尝试加载 jar 文件进行连接时出现以下错误。

loggerName="org.hibernate.orm.url" threadName="main" txnId="" HHH10000002: File or directory named by URL [file:/opt/test/app/app.war!/WEB-INF/classes] could not be found.  URL will be ignored
java.io.FileNotFoundException: /opt/test/app/app.war!/WEB-INF/classes (No such file or directory)
    at java.util.zip.ZipFile.open(Native Method)
    at java.util.zip.ZipFile.<init>(ZipFile.java:225)
    at java.util.zip.ZipFile.<init>(ZipFile.java:155)
    at java.util.jar.JarFile.<init>(JarFile.java:166)
    at java.util.jar.JarFile.<init>(JarFile.java:103)
    at org.hibernate.boot.archive.internal.JarFileBasedArchiveDescriptor.resolveJarFileReference(JarFileBasedArchiveDescriptor.java:165)
    at org.hibernate.boot.archive.internal.JarFileBasedArchiveDescriptor.visitArchive(JarFileBasedArchiveDescriptor.java:51)
    at org.hibernate.boot.archive.scan.spi.AbstractScannerImpl.scan(AbstractScannerImpl.java:47)
    at org.hibernate.boot.model.process.internal.ScanningCoordinator.coordinateScan(ScanningCoordinator.java:75)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.prepare(MetadataBuildingProcess.java:98)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:199)
    at org.hibernate.jpa.boot.spi.Bootstrap.getEntityManagerFactoryBuilder(Bootstrap.java:34)
    at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilder(HibernatePersistenceProvider.java:165)
    at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilderOrNull(HibernatePersistenceProvider.java:114)
    at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilderOrNull(HibernatePersistenceProvider.java:71)
    at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:52)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)

在 docker 文件或 kubernetes 部署 yaml 文件中是否有任何权限?

休眠配置,

Map<String, String> Props = new HashMap<String, String>();
        conProps.put("javax.persistence.jdbc.url", "JDBC_URL");
        conProps.put("javax.persistence.jdbc.password", "PASSWORD");
        conProps.put("javax.persistence.jdbc.user", "USER");
        conProps.put("oracle.net.ssl_cipher_suites","CIPHER");
        conProps.put("javax.persistence.jdbc.driver", "oracle.jdbc.OracleDriver");

         Persistence.createEntityManagerFactory("appjdbc", conProps);

我检查了 hibernate-core.jar 并执行了以下代码。 不确定,是否应该返回 JarProtocolArchiveDescriptor 但返回 JarFileBasedArchiveDescriptor。

public ArchiveDescriptor buildArchiveDescriptor(URL url, String entry) {
        final String protocol = url.getProtocol();
        if ( "jar".equals( protocol ) ) {
            return new JarProtocolArchiveDescriptor( this, url, entry );
        }
        else if ( StringHelper.isEmpty( protocol )
                || "file".equals( protocol )
                || "vfszip".equals( protocol )
                || "vfsfile".equals( protocol ) ) {
            final File file = new File( extractLocalFilePath( url ) );
            if ( file.isDirectory() ) {
                return new ExplodedArchiveDescriptor( this, url, entry );
            }
            else {
                return new JarFileBasedArchiveDescriptor( this, url, entry );
            }
        }
        else {
            //let's assume the url can return the jar as a zip stream
            return new JarInputStreamBasedArchiveDescriptor( this, url, entry );
        }
    }

【问题讨论】:

  • 另外,为了更好的衡量,在ADD 命令之后添加RUN ls -la /opt/test/app Dockerfile 以确保您和 docker 在同一页面上 -- ADDCOPY 可以zip 文件的奇怪之处

标签: docker kubernetes


【解决方案1】:

loggerName="org.hibernate.orm.url" threadName="main" txnId="" HHH10000002: 由 URL 命名的文件或目录 [file:/opt/test/app/app.war!/WEB-INF/类] 找不到。网址将被忽略

不,这不是权限被拒绝,而是使用了不正确的 URL 方案。 file://thing 很好,但使用“bang”语法需要在 URL 前加上 jar: 前缀,如下所示:

jar:file:///opt/test/app/app.war!/WEB-INF/classes

如果没有更多上下文,我不能说这是休眠错误还是您的配置错误,但我可以非常自信地说错误消息完全正确:没有像 app.war! 这样的目录

【讨论】:

  • 是的,没有app.war!目录。为什么它在那里搜索而不是 jar:可能是什么配置问题?
  • “没有更多的上下文我不能说”——你是在为休眠提供一些配置,还是它自动检测到错误的东西?实际上,更重要的是:应用程序是否在 docker 外部 成功运行?
猜你喜欢
  • 1970-01-01
  • 2016-06-16
  • 2019-12-06
  • 1970-01-01
  • 2018-02-08
  • 2011-08-12
  • 2018-09-19
相关资源
最近更新 更多