k8s:离线部署tomcatV11.0.9,报Cannot find /opt/bitnami/tomcat/bin/setclasspath.sh

本文记录了在离线环境下部署Tomcat容器时遇到的权限问题及解决方案。在Docker环境中运行Tomcat时出现"找不到setclasspath.sh"错误,通过添加--security-opt seccomp=unconfined参数解决。在Kubernetes环境中部署时出现相同问题,通过设置containerSecurityContext.seccompProfile.type=Unconfined解决。文章对比了Unconfined和RuntimeDefault两种seccomp

一、离线环境

CPU:Hygon C86 7285 32-core Processor

操作系统:麒麟操作系统

containerd:1.7.27

Kubernetes:1.26.12

KubeSphere:4.1.2

kubekey:3.1.10

Harbor:2.13.1

二、docker下的现象

执行如下代码:

docker run -dit \

--name tomcat \

-p 8084:8080 \

-e TOMCAT_USERNAME=admin \

-e TOMCAT_PASSWORD=Sinops1234 \

bitnami/tomcat:latest

报如下错误:

Cannot find /opt/bitnami/tomcat/bin/setclasspath.sh

原因:

权限不够。

解决方案:

docker run -dit \

--name tomcat \

-p 8084:8080 \

--security-opt seccomp=unconfined \

-e TOMCAT_USERNAME=admin \

-e TOMCAT_PASSWORD=Sinops1234 \

bitnami/tomcat:latest

|------------|-------------------------------------|------------------------------------|
| 特性 | apparmor:unconfined | seccomp=unconfined |
| 所属模块 | AppArmor | seccomp |
| 控制内容 | 文件路径、网络访问、权限等 | 系统调用(syscalls) |
| 用途 | 限制程序对系统资源的访问 | 限制程序能执行的底层系统操作 |
| 安全影响 | 更细粒度的访问控制 | 防止危险系统调用被执行 |
| 默认行为 | Docker 会应用默认 AppArmor profile(如果启用) | Docker 默认启用 seccomp,限制部分危险 syscall |
| 何时使用 | 容器无法访问特定文件或资源 | 容器因系统调用失败而崩溃 |

三、k8s下的现象

执行如下命令:

helm install tomcat ./tomcat-12.0.0.tgz \

--namespace default \

--set image.registry=172.23.123.117:8443 \

--set image.repository=library/bitnami/tomcat \

--set image.tag=latest \

--set image.pullPolicy=IfNotPresent \

--set image.pullSecrets=sinopsreg \

--set global.security.allowInsecureImages=false \

--set usePasswordFiles=false \

--set existingSecret=tomcat-secrets \

--set secretKeys.adminUsernameKey=tomcat-username \

--set secretKeys.adminPasswordKey=tomcat-password

报如下错误:

Cannot find /opt/bitnami/tomcat/bin/setclasspath.sh

原因:

权限不够。

解决方案:

helm install tomcat ./tomcat-12.0.0.tgz \

--namespace default \

--set image.registry=172.23.123.117:8443 \

--set image.repository=library/bitnami/tomcat \

--set image.tag=latest \

--set image.pullPolicy=IfNotPresent \

--set image.pullSecrets=sinopsreg \

--set global.security.allowInsecureImages=false \

--set usePasswordFiles=false \

--set existingSecret=tomcat-secrets \

--set secretKeys.adminUsernameKey=tomcat-username \

--set secretKeys.adminPasswordKey=tomcat-password \

--set containerSecurityContext.seccompProfile.type=Unconfined

Unconfined:当你设置 seccompProfile.type: Unconfined,这意味着禁用了 Seccomp 安全策略,允许容器内的进程执行所有系统调用。这种方式提供了最大的灵活性,但也降低了安全性。

RuntimeDefault:相比之下,使用 "RuntimeDefault" 提供了一定程度的安全性提升,因为它限制了容器能够执行的系统调用,减少了潜在攻击面。

相关推荐
张忠琳7 小时前
【NVIDIA】 NVIDIA Container Toolkit v1.19.1 — OCI 模块超深度分析之三
云原生·容器·架构·kubernetes·nvidia
Elastic 中国社区官方博客9 小时前
将你的 Grafana Kubernetes 仪表板迁移到 Elastic Observability:相同的 PromQL,30 倍更快的查询
大数据·人工智能·elasticsearch·搜索引擎·容器·kubernetes·grafana
风曦Kisaki11 小时前
#企业级docker私有仓库构建:harbor仓库与阿里云镜像仓库
阿里云·docker·容器
期待着201311 小时前
docker 安装 ,在centos7.9
运维·docker·容器
骑上单车去旅行14 小时前
Docker Compose 命令完全指南:从构建到运维
docker·容器·eureka
前端Baymax15 小时前
K8s PodCrashLoopBackOff假阳性排查
云原生·容器·kubernetes
spider_xcxc15 小时前
K8s 部署学习笔记
docker·容器·kubernetes·云计算·k8s
阿标在干嘛1 天前
从物理机到K8s:政策快报平台的容器化部署实践
云原生·容器·kubernetes
IT瑞先生1 天前
docker-compose下快速部署实操——持续更新...
运维·docker·容器
张青贤1 天前
Centos7离线部署K8s集群V1.28.8
云原生·容器·kubernetes·containerd·kubekey·离线部署