调查了usermod,this,github之后,似乎没有一种可接受的方法来启用对{{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
/弹簧靴可写?
答案 0 :(得分:1)
您将/ opt / service / log定义为卷。完成此操作后,RUN
命令将无法进行进一步的更改。递归chmod
将在装有临时匿名卷的临时容器中运行,然后将匿名卷以及您所做的权限更改一起丢弃。
这在Dockerfile documentation中有详细说明:
- 从Dockerfile中更改卷:如果在声明了卷之后有任何构建步骤更改了卷中的数据,则这些更改将被丢弃。
我的最佳实践是完全从Dockerfile中删除VOLUME
定义,因为它会引起诸如此类的问题,并破坏下游用户进行更改的能力。您始终可以在运行时而不是在构建映像时,在docker-compose.yml或docker run
命令行中定义卷安装。如果必须在Dockerfile中定义卷,则将其移至文件末尾,并意识到您将无法在以后的Dockerfile中扩展该映像。