首页 > 解决方案 > 如何在 OPEN-SHIFT (docker-image) 上安装 JIRA-SERVER

问题描述

我试图通过 openshift 上的 docker-image 安装 jira-server。

我从 docker-desktop for windows 中提取了图像。添加了简单的 dockerfile 包括 USER ROOT 等。

尝试部署 pod 时。我收到错误,pod 进入循环。错误是:不同位置的权限错误。多次尝试重新定位 jira-home 目录但没有成功。

(尝试在封闭网络上安装)

感谢您的帮助!

标签: dockeropenshiftjira

解决方案


简答

官方的 Atlassian 镜像与 Kubernetes Derivatives /eg Openshift 不兼容,因为它们违反了一些关键概念。例如,在 Openshift 中,容器以任意用户 ID 运行,这意味着一个无名用户正在执行容器中的进程。这是一种安全机制,可防止容器以 root 身份运行,并限制逃离容器在集群主机上获得特权的风险。

解决方案

您确实需要从头开始重建映像。
此外,需要删除启动 python 脚本尝试修改文件系统权限的行为。

  1. 克隆官方 Repo
    https://bitbucket.org/atlassian-docker/docker-atlassian-jira/src/master/

  2. 修改 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}
  1. 修改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)
  1. 使用重建镜像--build-arg JIRA_VERSION= --build-arg ARTEFACT_NAME
  2. 奔跑和享受

详细检查

启动 atlassian 图像,用户 root 是第一个进入的用户,进行修改(chown ...),然后下降到用户“jira”。所有这些操作在 openshift 中都是不可能的。在大多数情况下,从官方镜像开始构建一个新的 Dockerfile 并在部署到集群之前修改所需文件和文件夹的权限是解决方案,但更糟糕的是,atlassian 选择将必要的目录“挂载”为 VOLUME。

他们甚至在评论中提到了这个问题。

VOLUME ["${JIRA_HOME}"] # Must be declared after setting perms

卷挂载后,权限只能在运行时持久修改。这迫使他们在容器启动后使用entrypoint_helpers.py. 这也是容器因多个“权限被拒绝”而失败的地方。

很高兴就此发出拉取请求,但不幸的是,它们托管在 bitbucket 上。


推荐阅读