Docker Compose部署ProfitTrailer遇PM2配置文件找不到权限问题
ProfitTrailer Docker Compose部署问题:PM2找不到配置文件
用docker run命令测试镜像时容器能正常启动,但使用docker-compose up启动时,PM2提示找不到pm2-ProfitTrailer.json配置文件,推测是容器无法写入共享卷导致的问题。
我的Dockerfile
FROM eclipse-temurin:8-jdk-alpine ARG PT_VERSION=2.5.32 ENV PT_VERSION ${PT_VERSION} RUN mkdir -p /app/ # install tools RUN apk update && apk add unzip curl # install nodejs RUN apk add --update nodejs npm RUN npm install pm2@latest -g # install profittrailer RUN curl https://github.com/taniman/profit-trailer/releases/download/$PT_VERSION/ProfitTrailer-$PT_VERSION.zip -L -o /app/profittrailer.zip RUN unzip /app/profittrailer.zip -d /app/ && mv /app/ProfitTrailer-$PT_VERSION /app/ProfitTrailer WORKDIR /app/ProfitTrailer RUN chmod +x ProfitTrailer.jar VOLUME /app/ProfitTrailer CMD pm2 start pm2-ProfitTrailer.json && pm2 log 0 EXPOSE 8081
我的docker-compose.yml
version: '3' services: profittrailer: container_name: profittrailer image: "doccie/profittrailer:latest" volumes: - /home/[user]/.profittrailer:/app/ProfitTrailer restart: unless-stopped ports: - "8081:8081"
容器日志输出
profittrailer | [PM2] Spawning PM2 daemon with pm2_home=/root/.pm2 profittrailer | [PM2] PM2 Successfully daemonized profittrailer | [PM2][ERROR] File pm2-ProfitTrailer.json not found
问题原因
当你通过Docker Compose将宿主机目录/home/[user]/.profittrailer挂载到容器内的/app/ProfitTrailer时,宿主机的空目录(或不含pm2-ProfitTrailer.json的目录)会直接覆盖容器内原本存在该文件的目录,导致PM2启动时找不到配置文件。而docker run未挂载卷时,容器使用自身镜像内的目录,文件存在所以能正常启动。
解决方案
方案1:先复制容器内的配置文件到宿主机挂载目录
先启动临时容器,将镜像内的/app/ProfitTrailer目录内容复制到宿主机挂载目录:
docker run --rm -v /home/[user]/.profittrailer:/tmp/profittrailer doccie/profittrailer:latest cp -r /app/ProfitTrailer/. /tmp/profittrailer/
完成后再执行docker-compose up -d启动服务。
方案2:修改Dockerfile,自动初始化挂载卷
修改Dockerfile,在构建时备份原始目录,启动时如果挂载卷为空则自动复制备份内容:
FROM eclipse-temurin:8-jdk-alpine ARG PT_VERSION=2.5.32 ENV PT_VERSION ${PT_VERSION} RUN mkdir -p /app/ # install tools RUN apk update && apk add unzip curl # install nodejs RUN apk add --update nodejs npm RUN npm install pm2@latest -g # install profittrailer RUN curl https://github.com/taniman/profit-trailer/releases/download/$PT_VERSION/ProfitTrailer-$PT_VERSION.zip -L -o /app/profittrailer.zip RUN unzip /app/profittrailer.zip -d /app/ && mv /app/ProfitTrailer-$PT_VERSION /app/ProfitTrailer # 备份原始目录作为模板 RUN cp -r /app/ProfitTrailer /app/ProfitTrailer-template WORKDIR /app/ProfitTrailer RUN chmod +x ProfitTrailer.jar VOLUME /app/ProfitTrailer # 启动时检查挂载卷是否为空,为空则复制模板内容 CMD if [ -z "$(ls -A /app/ProfitTrailer)" ]; then cp -r /app/ProfitTrailer-template/. /app/ProfitTrailer/; fi && pm2 start pm2-ProfitTrailer.json && pm2 log 0 EXPOSE 8081
重新构建镜像后,再用Docker Compose启动即可。
方案3:只挂载需要持久化的子目录
避免覆盖整个/app/ProfitTrailer目录,只挂载需要持久化的子目录(比如配置、日志等),这样容器内的原始文件不会被覆盖:
version: '3' services: profittrailer: container_name: profittrailer image: "doccie/profittrailer:latest" volumes: - /home/[user]/.profittrailer/config:/app/ProfitTrailer/config - /home/[user]/.profittrailer/logs:/app/ProfitTrailer/logs # 根据实际需求添加其他需要持久化的子目录 restart: unless-stopped ports: - "8081:8081"
内容的提问来源于stack exchange,提问作者Pieter Helsen
相关产品推荐
相关产品推荐

