当Web应用尝试将日志文件写入Docker卷时,权限被拒绝

时间:2018-10-15 11:21:38

标签: docker spring-boot

调查了usermodthisgithub之后,似乎没有一种可接受的方法来启用对{{1} }}。

Dockerfile:

/opt/service/log

java.io.FileNotFoundException: log/app.log (Permission denied)此注释修复有效,但由于以后可以更改目录,因此不可接受。

执行Dockerfile的输出:

FROM openjdk:8-alpine
RUN apk update && apk add --no-cache bash curl busybox
EXPOSE 8080
#1 RUN mkdir -p /opt/service/log ; chown -R user /opt/service/log  
VOLUME ["/opt/service/log"]
# a few COPY commands
RUN adduser -D -S -u 1000 user && chown -R 1000 /opt/service/
#2 RUN chmod -R 777 /opt/service

RUN chmod 755 /opt/service/entrypoint.sh

USER 1000
RUN ls -la .
RUN touch /opt/service/log/test.log

ENTRYPOINT ["/opt/service/entrypoint.sh"]

如何使卷#1 /弹簧靴可写?

1 个答案:

答案 0 :(得分:1)

您将/ opt / service / log定义为卷。完成此操作后,RUN命令将无法进行进一步的更改。递归chmod将在装有临时匿名卷的临时容器中运行,然后将匿名卷以及您所做的权限更改一起丢弃。

这在Dockerfile documentation中有详细说明:

  
      
  • 从Dockerfile中更改卷:如果在声明了卷之后有任何构建步骤更改了卷中的数据,则这些更改将被丢弃。
  •   

我的最佳实践是完全从Dockerfile中删除VOLUME定义,因为它会引起诸如此类的问题,并破坏下游用户进行更改的能力。您始终可以在运行时而不是在构建映像时,在docker-compose.yml或docker run命令行中定义卷安装。如果必须在Dockerfile中定义卷,则将其移至文件末尾,并意识到您将无法在以后的Dockerfile中扩展该映像。