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
相关产品推荐
相关产品推荐

