在OpenShift上运行Docker镜像时"No such file or directory"错误,但在执行"docker run"时没有错误



我有一个 Spring 应用程序内置到 Docker 镜像中,dockerfile

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

在 OpenShift 上创建应用程序时

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>

你能告诉我我错过了什么吗?

我使用的版本:

*# 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*

是否有可能是权限问题?

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

因此,除了建议添加到 Dockerfile @Rico命令之外,我还要添加:

RUN mkdir -p /opt/app/log 
&& chown -R :root /opt/app/log 
&& chmod -R 0775 /opt/app/log

这篇博客文章提供了有关使用非根用户或随机用户 ID 运行 Docker 容器的更多信息。(免责声明:我隶属于该网站(

当您运行oc和运行docker时,${user.dir}可能有所不同。

首先,我将在两个环境中检查该值。

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

最新更新