docker - 如何在 OPEN-SHIFT (docker-image) 上安装 JIRA-SERVER
问题描述
我试图通过 openshift 上的 docker-image 安装 jira-server。
我从 docker-desktop for windows 中提取了图像。添加了简单的 dockerfile 包括 USER ROOT 等。
尝试部署 pod 时。我收到错误,pod 进入循环。错误是:不同位置的权限错误。多次尝试重新定位 jira-home 目录但没有成功。
(尝试在封闭网络上安装)
感谢您的帮助!
解决方案
简答
官方的 Atlassian 镜像与 Kubernetes Derivatives /eg Openshift 不兼容,因为它们违反了一些关键概念。例如,在 Openshift 中,容器以任意用户 ID 运行,这意味着一个无名用户正在执行容器中的进程。这是一种安全机制,可防止容器以 root 身份运行,并限制逃离容器在集群主机上获得特权的风险。
解决方案
您确实需要从头开始重建映像。
此外,需要删除启动 python 脚本尝试修改文件系统权限的行为。
克隆官方 Repo
https://bitbucket.org/atlassian-docker/docker-atlassian-jira/src/master/修改 Dockerfile 并添加到 UserGroup 创建步骤:
RUN groupadd --gid ${RUN_GID} ${RUN_GROUP} \
...
&& chown -R ${RUN_USER}:${RUN_GROUP} ${JIRA_HOME} \
# make the image compatible to run as an arbitrary uid
&& chgrp -R 0 /etc/container_id \
&& chmod -R g=u /etc/container_id \
&& chmod -R 460 /etc/container_id \
&& chgrp -R 0 ${JIRA_INSTALL_DIR} \
&& chmod -R g=u ${JIRA_INSTALL_DIR} \
&& chgrp -R 0 ${JIRA_HOME} \
&& chmod -R g=u ${JIRA_HOME}
- 修改
gen_cfg
函数 fromentrypoint_helpers.py
并删除else
末尾的子句。必要的权限已在步骤 2 中设置。
def gen_cfg(tmpl, target, user='root', group='root', mode=0o644, overwrite=True):
if not overwrite and os.path.exists(target):
logging.info(f"{target} exists; skipping.")
return
logging.info(f"Generating {target} from template {tmpl}")
cfg = jenv.get_template(tmpl).render(env)
try:
with open(target, 'w') as fd:
fd.write(cfg)
except (OSError, PermissionError):
logging.warning(f"Container not started as root. Bootstrapping skipped for '{target}'")
# else:
# set_perms(target, user, group, mode)
- 使用重建镜像
--build-arg JIRA_VERSION= --build-arg ARTEFACT_NAME
- 奔跑和享受
详细检查
启动 atlassian 图像,用户 root 是第一个进入的用户,进行修改(chown ...),然后下降到用户“jira”。所有这些操作在 openshift 中都是不可能的。在大多数情况下,从官方镜像开始构建一个新的 Dockerfile 并在部署到集群之前修改所需文件和文件夹的权限是解决方案,但更糟糕的是,atlassian 选择将必要的目录“挂载”为 VOLUME。
他们甚至在评论中提到了这个问题。
VOLUME ["${JIRA_HOME}"] # Must be declared after setting perms
卷挂载后,权限只能在运行时持久修改。这迫使他们在容器启动后使用entrypoint_helpers.py
. 这也是容器因多个“权限被拒绝”而失败的地方。
很高兴就此发出拉取请求,但不幸的是,它们托管在 bitbucket 上。
推荐阅读
- postgresql - PostgreSQL 插入 2 个表?
- swift - 在swift中以默认情况访问switch case参数
- android - 向 AWS 用户池验证社交身份联合用户?- 安卓
- database - Wordpress 迁移问题 503 错误
- angular - 在 JHipster 中创建实体后重定向到路由
- angular - 更新输入数组
- android - 使用可访问性滚动搜索栏
- c# - 使用 MVC C# 应用程序使用 Gsuite 登录
- php - 如何通过表格构建器中的按钮将信息传递给表单构建器?
- asp.net - 使用 gridview aspx 更新 SQL Server 表