You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

K8s部署Tomcat容器从S3导WAR文件遇只读文件系统错误求助

问题描述

尝试将S3 Bucket中的WAR文件下载到Kubernetes运行的Tomcat Docker容器时,触发只读文件系统错误:

download failed: s3://folder/myapp.war to ../../usr/local/tomcat/webapps/myapp.war [Errno 30] Read-only file system: '/usr/local/tomcat/webapps/myapp.war.8bEd47FD'

关联配置文件

Dockerfile

FROM tomcat:9.0

COPY --from=0 /usr/local/bin/creds-helper  /usr/local/bin/creds-helper

RUN apt-get update && apt-get install -y --no-install-recommends python3 python3-pip python3-setuptools

RUN pip3 install awscli

RUN mkdir -p /scripts
COPY k8s/launch.sh /scripts/

RUN useradd -m -u 59417 -d /home/nonroot -s /bin/bash nonroot
USER 59417:59417

CMD ["/bin/bash"]

launch.sh脚本

#!/bin/bash

aws s3 cp s3://folder/myapp.war /usr/local/tomcat/webapps/myapp.war

catalina.sh run

Kubernetes部署配置片段

- command: [bash, -c, bash /scripts/launch.sh]
         image: my_dockerfile
         securityContext:
           allowPrivilegeEscalation: false
           readOnlyRootFilesystem: true
           capabilities:
             drop:
               - ALL
         imagePullPolicy: Always
         name: pod_name
         ports:
           - {containerPort: 8888}
         volumeMounts:
           - {mountPath: /home/nonroot, name: nonroot}
           - {mountPath: /secrets, name: secrets}

已尝试在Dockerfile中执行RUN chmod 777 /usr/local/tomcat/和RUN chmod -R a+rwx /usr/local/tomcat/,ls -l显示webapps目录权限为drwxrwxrwx 1 root root 6 Oct 13 18:07 webapps,但仍无法写入。

解决方案

问题根源是Kubernetes配置中开启了readOnlyRootFilesystem: true,整个容器根文件系统处于只读状态,即便目录权限设为777也无法写入。解决方式是给Tomcat需要写入的目录挂载可写卷:

  • 修改Kubernetes部署配置,新增emptyDir卷并挂载到/usr/local/tomcat/webapps:
    # 在spec.containers[0].volumeMounts中添加以下挂载配置
    - mountPath: /usr/local/tomcat/webapps
      name: tomcat-webapps
    
    # 在spec.volumes中新增对应卷定义
    volumes:
      - name: tomcat-webapps
        emptyDir: {}
      # 保留原有卷配置
      - name: nonroot
        emptyDir: {}
      - name: secrets
        secret:
          secretName: your-secret-name
    
  • 权限说明:emptyDir卷挂载后,容器内的nonroot用户默认拥有该目录的写入权限,无需额外修改Dockerfile的权限设置。
  • 可选优化:如果需要持久化WAR文件,可替换emptyDir为PersistentVolumeClaim;若仅需临时存储,emptyDir足够满足需求。

内容的提问来源于stack exchange,提问作者mraz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 15:20:32