В доступе отказано, когда веб-приложение пытается записать файл журнала на том докера - PullRequest
0 голосов
/ 15 октября 2018

После исследования usermod , this , github кажется, что не существует приемлемого способа включить доступ для записи с пружинной загрузкой в ​​/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 это закомментированное исправление работает, но неприемлемо, поскольку каталог может быть изменен позже.

Вывод выполнения Dockerfile:

[INFO] DOCKER> Step 13/15 : RUN ls -la .
[INFO] DOCKER> 
[INFO] DOCKER> ---> Running in a99022c07da2
[INFO] DOCKER> total 28088
drwxr-xr-x    1 user   root          4096 Oct 15 11:05 .
drwxr-xr-x    1 root     root          4096 Oct 15 11:02 ..
-rw-r--r--    1 user   root          4367 Sep 17 10:18 entrypoint.sh
drwxr-xr-x    2 root     root          4096 Oct 15 11:05 log
-rw-r--r--    1 user   root      28741050 Oct 15 11:05 service.jar
[INFO] DOCKER> Removing intermediate container a99022c07da2
[INFO] DOCKER> ---> d0831197c79c
[INFO] DOCKER> Step 14/15 : RUN touch /opt/service/log/test.log
[INFO] DOCKER> 
[INFO] DOCKER> ---> Running in 54f5d57499fc
[INFO] DOCKER> [91mtouch: /opt/service/log/test.log: Permission denied

Как сделать том для записи пользователем user / spring boot?

1 Ответ

0 голосов
/ 15 октября 2018

Вы определили / opt / service / log как том.Как только вы это сделаете, дальнейшие изменения в командах RUN невозможны.Рекурсивный chmod будет выполняться во временном контейнере с подключенным временным анонимным томом, а затем анонимный том сбрасывается вместе с изменениями разрешений, которые вы внесли.

Это подробно описано в Документация Dockerfile :

  • Изменение тома из Dockerfile: если какие-либо этапы сборки изменят данные в томе после его объявления, эти изменения будут отброшены.

Моя лучшая практика - полностью удалить определение VOLUME из Dockerfile, поскольку оно вызывает подобные проблемы и лишает возможности последующих пользователей вносить изменения.Вы всегда можете определить монтирование тома в командной строке docker-compose.yml или docker run во время выполнения, а не при создании образа.Если вам нужно определить том внутри вашего Dockerfile, переместите его в конец файла и поймите, что вы не сможете расширить этот образ в более позднем Dockerfile.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...