在OpenShift上运行Docker镜像时出现“没有这样的文件或目录”错误,但在执行“docker run”时却没有

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

我在Qazxswpoi中使用以下命令将一个Spring应用程序内置到Docker镜像中

dockerfile

在OpenShift上创建应用程序时

CMD cd /opt/app/jar \
    && java -Dspring.config.location=file:/opt/app/config/ -Dspring.profiles.active=test -jar *.jar

并用oc new-app --name=test-app --docker-image=MyImage 检查日志,我看到这个错误:

oc logs <pod_name>

但是,当我直接使用java.lang.IllegalStateException: Logback configuration error detected: ERROR in ch.qos.logback.core.rolling.RollingFileAppender[LOGFILE] - Failed to create parent directories for [/opt/app/jar/../log/debug.log] ERROR in ch.qos.logback.core.rolling.RollingFileAppender[LOGFILE] - openFile(/opt/app/jar/../log/debug.log,true) call failed. java.io.FileNotFoundException: /opt/app/jar/../log/debug.log (No such file or directory) 运行图像,然后执行上面的docker run -it <image_ID> /bin/bash命令时,它运行正常。

这是我的java -jar文件的片段:

logback.xml

你能告诉我想念的吗?

我使用的版本:

<appender name="LOGFILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${user.dir}/../log/debug.log</file>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${user.dir}/../log/archived/debug.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>50MB</maxFileSize>
            <maxHistory>10</maxHistory>
        </rollingPolicy>
    </appender>
spring docker kubernetes openshift logback
2个回答
0
投票

当你运行*# oc version oc v3.7.14 kubernetes v1.7.6+a08f5eeb62 features: Basic-Auth GSSAPI Kerberos SPNEGO # docker version Client: Version: 1.12.6 API version: 1.24 Package version: docker-1.12.6-71.git3e8e77d.el7.x86_64 Go version: go1.8.3 Git commit: 3e8e77d/1.12.6 Built: Wed Dec 13 12:18:58 2017 OS/Arch: linux/amd64 Server: Version: 1.12.6 API version: 1.24 Package version: docker-1.12.6-71.git3e8e77d.el7.x86_64 Go version: go1.8.3 Git commit: 3e8e77d/1.12.6 Built: Wed Dec 13 12:18:58 2017 OS/Arch: linux/amd64* 和运行${user.dir}时,oc可能有所不同。

我首先检查两个环境中的值。

docker的情况下,它显然不存在于容器中,因此一个解决方法是从oc创建一个容器。


0
投票

是否可能是权限问题?

除非发生了某些变化...为了更好的安全性,OpenShift默认使用具有随机UID的用户运行容器;该用户是根组的成员。

所以,除了@Rico建议添加到Dockerfile的命令之外,我还要添加:

MyImage

这个RUN mkdir -p /opt/app/log \ && chown -R :root /opt/app/log \ && chmod -R 0775 /opt/app/log 有关于使用非root用户或随机用户ID运行Docker容器的更多信息。 (免责声明:我隶属于该网站)

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