通过检查图像我发现构建包使用/cnb/lifecycle/launcher
启动应用程序。因此,我能够在启动之前自定义 docker 命令并修复特定文件夹的所有者:
version: '3.5'
services:
app:
image: app:latest
# enable the app to write to the storage folder (docker will create it as root by default)
user: root
command: "/bin/sh -c 'chown 1000:1000 /var/lib/app/files && /cnb/lifecycle/launcher'"
volumes:
- app-storage:/var/lib/app/files
// ...ports etc
volumes:
app-storage:
尽管如此,这仍然不是很好,因为它不是直截了当的(因此我未来的自己将需要花时间再次理解它),而且它的可扩展性也非常有限。
更新 30.10.2020 - Spring Boot 2.3
我们最终创建了另一个 Dockerfile/层,这样我们就不需要在 docker-compose 文件中为此烦恼:
# The base_image should hold a reference to the image created by ./gradlew bootBuildImage
ARG base_image
FROM ${base_image}
ENV APP_STORAGE_LOCAL_FOLDER_PATH /var/lib/app/files
USER root
RUN mkdir -p ${APP_STORAGE_LOCAL_FOLDER_PATH}
RUN chown ${CNB_USER_ID}:${CNB_GROUP_ID} ${APP_STORAGE_LOCAL_FOLDER_PATH}
USER ${CNB_USER_ID}:${CNB_GROUP_ID}
ENTRYPOINT /cnb/lifecycle/launcher
更新 25.11.2020 - Spring Boot 2.4
请注意,上面的 Dockerfile 将导致此错误:
ERROR: failed to launch: determine start command: when there is no default process a command is required
原因是 paketo 构建器的默认入口点发生了更改。更改入口点/cnb/lifecycle/launcher
到新的修复它:
ENTRYPOINT /cnb/process/web
另请参阅这个问题:错误:启动失败:确定启动命令:当没有默认进程时,需要命令