短臂春季靴

在我的springboot项目中,有三个配置文件

  

application.yml->用于本地开发
  application-test.yml->在测试环境中运行
  application-prod.yml->在生产环境中运行

pom.xml

...

<properties>
    <docker-repository>self-ip:port</docker-repository>
</properties>

...

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>

        <plugin>
            <groupId>com.google.cloud.tools</groupId>
            <artifactId>jib-maven-plugin</artifactId>
            <version>1.7.0</version>
            <configuration>
                <allowInsecureRegistries>true</allowInsecureRegistries>
                <from>
                    <image>openjdk:8-jre-alpine</image>
                </from>
                <to>
                    <image>${docker-repository}/${project.groupId}/${project.artifactId}</image>
                </to>
                <container>
                    <creationTime>USE_CURRENT_TIMESTAMP</creationTime>
                    <jvmflags>
                        <jvmflag>$JAVA_OPTS</jvmflag>
                        <jvmflag>-Dfile.encoding=UTF-8</jvmflag>
                        <jvmflag>-XX:+UseG1GC</jvmflag>
                        <jvmflag>-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Xloggc:/var/log/gc.log</jvmflag>
                        <jvmflag>-Djava.security.egd=file:/dev/./urandom</jvmflag>
                    </jvmflags>
                </container>
            </configuration>
        </plugin>
    </plugins>
</build>

然后推送到我自己的私有docker存储库,没关系

mvn -DsendCredentialsOverHttp=true jib:build

在其他计算机上运行

# On my test machine,I want to run like this
docker run --name test-xxx -d \
    -p 8080:8080 -p 9080:9080 \
    -e JAVA_OPTS="-Xms256m -Xmx256m -Dspring.profiles.active=test -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9080" \
    -v ~/logs:/logs \
    self-ip:port/xxx/yyy

# on my production machine,I want to run like this
docker run --name prod-xxx -d \
    -p 8080:8080 \
    -e JAVA_OPTS="-server -Xms1G -Xmx1G -Dspring.profiles.active=prod" \
    -v /mnt/logs:/logs \
    self-ip:port/xxx/yyy

我在测试机上运行时失败

docker container ls -al
CONTAINER ID    IMAGE   COMMAND                  CREATED         STATUS                     PORTS    NAMES
XXXXXXXXXXXX    xxx     "java $JAVA_OPTS -Df…"   3 seconds ago   Exited (1) 2 seconds ago            test-xxx

我的期望是

# test machine
java -Xms256m -Xmx256m -Dspring.profiles.active=test \
    -agentlib:jdwp=transport=dt_socket,address=9080 \
    -Dfile.encoding=UTF-8 -XX:+UseG1GC -verbose:gc \
    -XX:+PrintGCDetails -XX:+PrintGCDateStamps \
    -XX:+PrintGCTimeStamps -Xloggc:/logs/gc.log \
    -Djava.security.egd=file:/dev/./urandom \
    -cp /app/resources:/app/classes:/app/libs/* \
    xxx.yyy.MainClass

# production machine
java -server -Xms1G -Xmx1G -Dspring.profiles.active=prod \
    -Dfile.encoding=UTF-8 -XX:+UseG1GC -verbose:gc \
    -XX:+PrintGCDetails -XX:+PrintGCDateStamps \
    -XX:+PrintGCTimeStamps -Xloggc:/logs/gc.log \
    -Djava.security.egd=file:/dev/./urandom \
    -cp /app/resources:/app/classes:/app/libs/* \
    xxx.yyy.MainClass

我应该如何配置? container --> environment还是dockerClient --> environment
我没有在文档中找到任何相关示例,它们都只是一个句子


更新1

@Haran,我将<jvmflag>$JAVA_OPTS</jvmflag>修改为JAVA_TOOL_OPTS并重新推送

并运行测试

docker container rm test-xxx
docker run --name test-xxx -d \
    -p 8080:8080 \
    -e "JAVA_TOOL_OPTIONS=-Xms256m -Xmx256m -Dspring.profiles.active=test -agentlib:jdwp=transport=dt_socket,address=9080" \
    ip:port/xx/yy

它也运行失败

$ docker container ls -al
CONTAINER ID    IMAGE   COMMAND                       CREATED         STATUS                     PORTS    NAMES
XXXXXXXXXXXX    xxx     "java $JAVA_TOOL_OPTS -Df…"   3 seconds ago   Exited (1) 2 seconds ago            test-xxx

然后我删除$ JAVA_TOOL_OPTS并重复上述重推和docker rm & run,运行成功,但没有自定义环境

$ docker exec -it test-xxx ps auxf
PID   USER     TIME  COMMAND
    1 root      0:05 java -Dfile.encoding=UTF-8 -XX:+UseG1GC -verbose:gc -XX:+P
   59 root      0:00 ps auxf


$ docker ps --no-trunc
CONTAINER ID    IMAGE  COMMAND                                                                                                                                                                                                                                              CREATED             STATUS              PORTS                    NAMES
xx              yy     "java -Dfile.encoding=UTF-8 -XX:+UseG1GC '-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Xloggc:/logs/gc.log' -Djava.security.egd=file:/dev/./urandom -cp /app/resources:/app/classes:/app/libs/* xx.yy.MainClass"   34 seconds ago      Up 34 seconds       0.0.0.0:8080->8080/tcp   test-xxx

更新2

docker -e ...命令的引号在内部和外部之间没有区别。

$ docker run --name test-xxx -d -p 8080:8080 \
    -e JAVA_TOOL_OPTIONS="-Xms256m -Xmx256m -Dspring.profiles.active=test -agentlib:jdwp=transport=dt_socket,address=9080" \
    ip:port/xx/yy
xxxxx

$ docker exec -it test-xxx env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/java-1.8-openjdk/jre/bin:/usr/lib/jvm/java-1.8-openjdk/bin
HOSTNAME=4a7c5045109b
TERM=xterm
JAVA_TOOL_OPTIONS=-Xms256m -Xmx256m -Dspring.profiles.active=test -agentlib:jdwp=transport=dt_socket,address=9080
JAVA_HOME=/usr/lib/jvm/java-1.8-openjdk/jre
JAVA_VERSION=8u212
JAVA_ALPINE_VERSION=8.212.04-r0
LANG=C.UTF-8
HOME=/root


$ docker run --name test-xxx1 -d -p 8081:8080 \
    -e "JAVA_TOOL_OPTIONS=-Xms256m -Xmx256m -Dspring.profiles.active=test -agentlib:jdwp=transport=dt_socket,address=9080" \
    ip:port/xx/yy
xxxx

$ docker exec -it test-xxx1 env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/java-1.8-openjdk/jre/bin:/usr/lib/jvm/java-1.8-openjdk/bin
HOSTNAME=ae333ad8836f
TERM=xterm
JAVA_TOOL_OPTIONS=-Xms256m -Xmx256m -Dspring.profiles.active=test -agentlib:jdwp=transport=dt_socket,address=9080
JAVA_HOME=/usr/lib/jvm/java-1.8-openjdk/jre
JAVA_VERSION=8u212
JAVA_ALPINE_VERSION=8.212.04-r0
LANG=C.UTF-8
HOME=/root


$ docker ps --no-trunc         
CONTAINER ID    IMAGE           COMMAND                                                                                                                                                                                                                                               CREATED             STATUS              PORTS                    NAMES
xxx             ip:port/xx/yy   "java -Dfile.encoding=UTF-8 -XX:+UseG1GC -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Xloggc:/var/log/gc.log -Djava.security.egd=file:/dev/./urandom -cp /app/resources:/app/classes:/app/libs/* xx.yy.MainClass"   3 minutes ago       Up 3 minutes        0.0.0.0:8081->8080/tcp   test-xxx1
xx              ip:port/xx/yy   "java -Dfile.encoding=UTF-8 -XX:+UseG1GC -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Xloggc:/var/log/gc.log -Djava.security.egd=file:/dev/./urandom -cp /app/resources:/app/classes:/app/libs/* xx.yy.MainClass"   3 minutes ago       Up 3 minutes        0.0.0.0:8080->8080/tcp   test-xxx
mz202 回答:短臂春季靴

要设置JVM参数,只需在运行时设置JAVA_TOOL_OPTIONS。实际上,我可以从您的更新中看到您已经尝试过此操作。

$ docker run ... -e "JAVA_TOOL_OPTIONS=..."

大多数JVM会自动选择JAVA_TOOL_OPTIONS环境变量,因此您不需要将JAVA_TOOL_OPTIONS中的内容作为命令行参数传递给java二进制文件。您可以在计算机上本地(在容器内部或外部)验证此行为:

$ JAVA_TOOL_OPTIONS=-Xmx256m java ABCD # no need to pass extra arguments
Picked up JAVA_TOOL_OPTIONS: -Xmx256m
Error: Could not find or load main class ABCD
$ docker run -e "JAVA_TOOL_OPTIONS=-Xmx256m" --entrypoint java openjdk:11 ABCD
Picked up JAVA_TOOL_OPTIONS: -Xmx256m
Error: Could not find or load main class ABCD
Caused by: java.lang.ClassNotFoundException: ABCD

因此,只需在运行时定义JAVA_TOOL_OPTIONS(并且您已经使用docker run -e进行了定义),而不定义<jvmFlags>或修改<entrypoint>

最后,它是JAVA_TOOL_OPTIONS,而不是JAVA_TOOL_OPTS

,

JAVA_TOOL_OPTIONS已经有效,现在我只需要这样做。

<properties>
    <docker-repository>self-ip:port</docker-repository>
</properties>

<plugin>
    <groupId>com.google.cloud.tools</groupId>
    <artifactId>jib-maven-plugin</artifactId>
    <version>1.7.0</version>
    <configuration>
        <allowInsecureRegistries>true</allowInsecureRegistries>
        <from>
            <image>openjdk:8-jre-alpine</image>
        </from>
        <to>
            <image>${docker-repository}/${project.groupId}/${project.artifactId}</image>
        </to>
        <container>
            <creationTime>USE_CURRENT_TIMESTAMP</creationTime>
            <jvmFlags>
                <!-- global java option -->
                <jvmFlag>-Dfile.encoding=UTF-8</jvmFlag>
                <jvmFlag>-XX:+UseG1GC</jvmFlag>
                <jvmFlag>-verbose:gc</jvmFlag>
                <jvmFlag>-XX:+PrintGCDetails</jvmFlag>
                <jvmFlag>-XX:+PrintGCDateStamps</jvmFlag>
                <jvmFlag>-XX:+PrintGCTimeStamps</jvmFlag>
                <jvmFlag>-Xloggc:/var/log/gc.log</jvmFlag>
                <jvmFlag>-Djava.security.egd=file:/dev/./urandom</jvmFlag>
            </jvmFlags>
        </container>
    </configuration>
</plugin>
# on test machine
docker run --name test-xxx -d \
    -p 8080:8080 -p 9080:9080 \
    -e JAVA_TOOL_OPTIONS="-Xms256m -Xmx256m -Dspring.profiles.active=test -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9080" \
    -v ~/logs:/var/log \
    self-ip:port/xxx/yyy

# on production machine
docker run --name prod-xxx -d \
    -p 8080:8080 \
    -e JAVA_TOOL_OPTIONS="-Xms1G -Xmx1G -Dspring.profiles.active=prod" \
    -v /mnt/logs:/var/log \
    self-ip:port/xxx/yyy

PS:无法在JAVA_TOOL_OPTIONS中使用https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/envvars002.html

添加-client -server选项

测试

$ docker top test-xxx         
UID     PID      PPID     C     STIME    TTY    TIME        CMD
root    32157    32138    15    11:05    ?      00:00:05    java -Dfile.encoding=UTF-8 -XX:+UseG1GC -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Xloggc:/var/log/gc.log -Djava.security.egd=file:/dev/./urandom -cp /app/resources:/app/classes:/app/libs/* xx.yy.MainClass

$ docker logs test-xxx 
Picked up JAVA_TOOL_OPTIONS: -Xms256m -Xmx256m -Dspring.profiles.active=test -agentlib:jdwp=transport=dt_socket,address=9080
Listening for transport dt_socket at address: 9080

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__,| / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (...)

产品

$ docker top prod-xxx
UID     PID      PPID     C    STIME    TTY    TIME        CMD
root    13989    13970    8    11:09    ?      00:00:05    java -Dfile.encoding=UTF-8 -XX:+UseG1GC -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Xloggc:/var/log/gc.log -Djava.security.egd=file:/dev/./urandom -cp /app/resources:/app/classes:/app/libs/* xx.yy.MainClass

$ docker logs prod-xxx           
Picked up JAVA_TOOL_OPTIONS: -Xms1G -Xmx1G -Dspring.profiles.active=prod

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__,| / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (...)

仅参数未附加到命令行选项,但它们是有效的。

,

选项 1:Java 系统属性(VM 参数)

将 -D 参数放在 application.jar 之前很重要,否则无法识别它们。

java -jar -Dspring.profiles.active=prod application.jar

选项 2:程序参数

java -jar application.jar --spring.profiles.active=prod --spring.config.location=c:\config

当使用 jib 作为 maven 插件时 - 更改 spring 配置文件位置的加载: 然后 entryPoint 在容器内传递,但似乎 jib 插件没有选择它。 因此,需要在 pom 中进行以下更改以获取该位置的参数访问权限:

  <plugin>
        <groupId>com.google.cloud.tools</groupId>
        <artifactId>jib-maven-plugin</artifactId>
        <version>2.2.0</version>
        <configuration>
            <to>
                <image>image-url</image>
            </to>
            <container>
                <creationTime>${​​​​​​maven.build.timestamp}​​​​​​</creationTime>
                <mainClass>com.package.SpringBootMainClass</mainClass>
                <args>
                    <arg>--spring.config.location=/demo/location/application.yml</arg>
                </args>
            </container>
        </configuration>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>build</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
本文链接:https://www.f2er.com/3162721.html

大家都在问