我正在尝试使用 Cloud Foundry 将一个简单的 Spring + Spring Boot 应用程序部署到 IBM Cloud。我的 Docker 文件如下所示:
# IBM Java SDK UBI is not available on public docker yet. Use regular
# base as builder until this is ready. For reference:
# https://github.com/ibmruntimes/ci.docker/tree/master/ibmjava/8/sdk/ubi-min
FROM ibmjava:8-sdk AS builder
LABEL maintainer="IBM Java Engineering at IBM Cloud"
WORKDIR /app
RUN apt-get update && apt-get install -y maven
COPY pom.xml .
RUN mvn -N io.takari:maven:wrapper -Dmaven=3.5.0
COPY . /app
RUN ./mvnw install
ARG bx_dev_user=root
ARG bx_dev_userid=1000
RUN BX_DEV_USER=$bx_dev_user
RUN BX_DEV_USERID=$bx_dev_userid
RUN if [ $bx_dev_user != "root" ]; then useradd -ms /bin/bash -u $bx_dev_userid $bx_dev_user; fi
# Multi-stage build. New build stage that uses the UBI as the base image.
# In the short term, we are using the OpenJDK for UBI. Long term, we will use
# the IBM Java Small Footprint JVM (SFJ) for UBI, but that is not in public
# Docker at the moment.
# (https://github.com/ibmruntimes/ci.docker/tree/master/ibmjava/8/sfj/ubi-min)
FROM adoptopenjdk/openjdk8:ubi-jre
# Copy over app from builder image into the runtime image.
RUN mkdir /opt/app
COPY --from=builder /app/target/javaspringapp-1.0-SNAPSHOT.jar /opt/app/app.jar
ENTRYPOINT [ "sh", "-c", "java -jar -XX:MaxRAM=10m /opt/app/app.jar" ]
如您所见,我已将应用程序限制为最多使用 10MB,而我的实例有 256MB 可用空间。但是,每次部署应用程序时,我都会收到以下错误:
此外,当我运行 ps 命令来检查正在运行的进程时,没有什么会消耗我的所有内存。
我在本地运行了相同的应用程序,它最多只需要 25MB,因此我的实例的 256MB 应该足够了。关于如何解决这个问题有什么想法吗?
注意:不幸的是,我目前不允许增加实例的容量。
[更新] 因此,我决定从头开始,在 IBM Cloud 中创建一个新的 Java Spring 应用程序。 IBM 自动将其设置为以 this template 开头,它被克隆到您的存储库中。应用程序已正常部署,我可以访问它。
现在,我删除了 HTML 中的一行代码并尝试再次部署。令我惊讶的是,我得到了:
FAILED
Error restarting application: Server error, status code: 400, error code: 100005, message: You have exceeded your organization's memory limit: app requested more memory than available
这怎么可能?!
最佳答案
我找到了解决办法;这是相当出乎意料且违反直觉的。这是我所做的:
- 我将应用实例的内存减少到 64MB。
- 在manifest.yml中,我将应用程序的内存设置为192M。我的 list 如下所示:
applications:
- instances: 1
timeout: 180
name: appname
buildpack: java_buildpack
path: ./target/appname-1.0-SNAPSHOT.jar
disk_quota: 1G
memory: 192M
domain: eu-gb.mybluemix.net
host: appHost
env:
JAVA_OPTS: '-XX:ReservedCodeCacheSize=32M -XX:MaxDirectMemorySize=32M'
JBP_CONFIG_OPEN_JDK_JRE: '[memory_calculator: {stack_threads: 2}]'
- 我将 manifest.yml 中的更改推送到存储库,开始新的部署。这次应用部署成功,运行顺利。
注意:部署后,实例的内存将被覆盖并分配 192MB。为了在代码中执行任何进一步的更改,我需要在推送更改和部署应用程序之前将内存设置回 64MB。
关于java - 服务器错误,状态代码 : 400, 错误代码 : 100005, 消息:您已超出组织的内存限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63004441/