首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我们可以在wso2 2/wso2mi Docker映像中更改Java版本吗?

我们可以在wso2 2/wso2mi Docker映像中更改Java版本吗?
EN

Stack Overflow用户
提问于 2021-06-29 04:31:17
回答 1查看 452关注 0票数 0

在目前使用wso2 2/WSO2MIENV JAVA_VERSION=jdk-11.0.10+9映像中,这是否有可能降级或升级这个ENV JAVA_VERSION=jdk-11.0.10+9版本?

我为什么要找这个?

在我的应用程序中,我们的SOAP服务抛出了一个奇怪的ENV JAVA_VERSION=jdk-11.0.10+9问题

代码语言:javascript
复制
{
    "httpCode": 502,
    "userMessage": "Invalid response from remote host",
    "developerMessage": "The creation time is ahead of the current time.",
    "details": {
        "detail": "wsse:InvalidSecurityToken"
    },
    "errorCode": "S:Sender",
    "timeStamp": 1624875331996,
    "transactionId": "CIP-urn:uuid:b813c0a1-da6a-4dfe-8647-7237f39de941"
}

当我们使用较低的1.2.0-centos7版本的wso2/wso2mi时,相同的代码工作得很好,所以我想用不同的wso2/wso2mi版本测试wso2/wso2mi

不确定这段代码是否为不同的java版本做了一些神奇的工作。

代码语言:javascript
复制
 private void addSecurityHeader(MessageContext mc, String username, String password) throws Exception {
        SecureRandom rand = SecureRandom.getInstance("SHA1PRNG");
        rand.setSeed(System.currentTimeMillis());
        byte[] nonceBytes = new byte[16];
        rand.nextBytes(nonceBytes);

        String createdDate = DateTimeFormatter.ISO_OFFSET_DATE_TIME.withZone(ZoneId.of("UTC")).format(Instant.now());
        byte[] createdDateBytes = createdDate.getBytes();

        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        stream.write(nonceBytes);
        stream.write(createdDateBytes);
        stream.write(password.getBytes(StandardCharsets.UTF_8));
        MessageDigest md = MessageDigest.getInstance("SHA-1");
        byte[] passwordDigest = md.digest(stream.toByteArray());

        SOAPEnvelope envelope = mc.getEnvelope();
        OMFactory factory = envelope.getOMFactory();

        OMNamespace securityNamespace = factory.createOMNamespace(
            "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "wsse");

        SOAPHeaderBlock securityBlock = envelope.getHeader().addHeaderBlock("Security", securityNamespace);
        securityBlock.setMustUnderstand(true);

        OMElement usernameTokenElement = factory.createOMElement("UsernameToken", securityNamespace);
        OMNamespace namespaceWSU = factory.createOMNamespace(
            "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "wsu");

        OMAttribute attribute = factory.createOMAttribute("Id", namespaceWSU, "SOAI_req_SOAI");
        usernameTokenElement.addAttribute(attribute);
        securityBlock.addChild(usernameTokenElement);

        OMElement usernameElement = factory.createOMElement("Username", securityNamespace);
        usernameElement.setText(username);
        usernameTokenElement.addChild(usernameElement);

        OMElement passwordElement = factory.createOMElement("Password", securityNamespace);

        attribute = factory.createOMAttribute("Type", null,
            "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest");
        passwordElement.addAttribute(attribute);
        passwordElement.setText(new String(Base64.encodeBase64(passwordDigest), StandardCharsets.UTF_8));
        usernameTokenElement.addChild(passwordElement);

        OMElement nonceElement = factory.createOMElement("Nonce", securityNamespace);
        attribute = factory.createOMAttribute("EncodingType", null,
            "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary");
        nonceElement.addAttribute(attribute);
        nonceElement.setText(new String(Base64.encodeBase64(nonceBytes), StandardCharsets.UTF_8));
        usernameTokenElement.addChild(nonceElement);

        OMElement createdElement = factory.createOMElement("Created", securityNamespace);
        createdElement.setText(createdDate);
        usernameTokenElement.addChild(createdElement);
    }

编辑1

因此,我尝试使用自己的Docker文件来创建图像,下面是内容

代码语言:javascript
复制
FROM wso2/wso2mi:4.0.0
FROM adoptopenjdk/openjdk8:jdk8u232-b09-slim
COPY /lib/* $WSO2_SERVER_HOME/lib/
COPY /carFiles/api_common-20.11.0-SNAPSHOT.car $WSO2_SERVER_HOME/repository/deployment/server/carbonapps/
COPY /carFiles/api_impl-20.11.0-SNAPSHOT.car $WSO2_SERVER_HOME/repository/deployment/server/carbonapps/
COPY /carFiles/api-20.11.0-SNAPSHOT.car $WSO2_SERVER_HOME/repository/deployment/server/carbonapps/

之后,构建将用于部署到Docker+Kubernetes环境中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-29 05:26:03

我们不能在运行时更改Java版本。因此,我们必须用所需的Java版本构建一个新映像。您可以使用现有的Dockerfile并对其进行修改以从头构建映像,也可以在wso2/wso2mi之上构建一个新映像并更改其中的Java。

作为参考,这里是用于构建wso2/wso2mi映像的Dockerfile

更新

下面给出了一个示例Dockerfile,以及使用Java 8在本地构建映像的步骤

  • 用Java 8基映像更新现有的CentOS Dockerfile 来自adoptopenjdk/openjdk8:x86_64-centos-jre8u242-b08
  • 下载并将wso2mi-4.0.0放在放置Dockerfile的同一目录中。将wso2mi-4.0.0重命名为wso2mi
  • 执行以下命令来构建映像 码头建设-t。-构建-arg MICROESB_VERSION=4.0.0
  • 一旦构建完毕,就在本地启动一个容器,以验证一切正常工作。然后,将映像推送到私有/公共Docker存储库,并在K8s中引用该存储库以提取映像。 码头运行-d --名称
  • 此外,您还可以执行exec命令以进入容器并验证Java 码头主管-it sh

更新2

当您使用现有的wso2/wso2mi映像来构建您自己的映像时,您可以遵循类似的方法来安装和配置Java8。

给定的方法从GitHub下载Java8二进制文件,并配置JAVA_HOMEPATH环境变量。在下面找到一个示例Dockerfile

代码语言:javascript
复制
FROM wso2/wso2mi:4.0.0
# FROM adoptopenjdk/openjdk8:jdk8u232-b09-slim

# Perform COPY artifacts
COPY /lib/* $WSO2_SERVER_HOME/lib/
...

# Download and configure Java 8
RUN \
    wget -O jdk8.tar.gz https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u292-b10/OpenJDK8U-jdk_x64_linux_hotspot_8u292b10.tar.gz; \
    mkdir -p ${WORKING_DIRECTORY}/openjdk-8; \
    cd ${WORKING_DIRECTORY}/openjdk-8; \
    tar -xf ${WORKING_DIRECTORY}/jdk8.tar.gz --strip-components=1; \
    export PATH=${WORKING_DIRECTORY}/openjdk-8/bin:$PATH; \
    rm ${WORKING_DIRECTORY}/jdk8.tar.gz;

ENV JAVA_HOME=${WORKING_DIRECTORY}/openjdk-8 \
    PATH=${WORKING_DIRECTORY}/openjdk-8/bin:$PATH
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68172654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档