如何在VSCode IDE中为JRE使用Docker容器?

bxjv4tth  于 12个月前  发布在  Docker
关注(0)|答案(2)|浏览(150)

在我的IDE VSCode中,我正在使用“Java”docker容器配置Language support for Java(TM) by Red Hat扩展。到目前为止,我已经能够设置运行时,但是我无法将IDE指向docker容器的Java主目录。
根据扩展的页面,这是我需要实现的,以使扩展工作:
此JDK将用于启动Java语言服务器。默认情况下,也将用于编译项目。
Java开发工具包的路径可以通过VS Code设置(工作区/用户设置)中的java.home设置来指定。如果未指定,则按以下顺序搜索,直到JDK满足当前最低要求。

  • JDK_HOME环境变量
  • JAVA_HOME环境变量
  • 在当前系统路径上

如何设置运行时

正如我已经说过的,我设法设置了一个运行时。这是我如何做到的:
1.为docker容器添加了一个java二进制文件,在我的例子中,我把它放在/usr/local/bin中。

#!/bin/sh

docker run \
     --name usr-local-bin-java \
     -i \
     --rm \
     --network=host \
     -w /root/project \
     -v "$PWD":/root/project \
     -v "$PWD"/.docker/mvn/cache:/root/.m2 \
     maven:3-jdk-8-slim \
     java "$@"

exit $?

字符串
我使用Maven镜像是因为我也需要Maven,它也包括Java。当然,也可以使用OpenJDK镜像。
1.添加/更新了我的IDE的用户settings.json,如下所示:

"java.configuration.runtimes": [
     {
         "name": "JavaSE-1.8",
         "path": "/usr/local/bin/java",
         "default": true
     }
],

我被困在

所以我面前的最后一步是指定java.home的路径。但是如果它位于docker容器中,我该怎么做呢?最明显的解决方案是将docker容器中的路径挂载到我的主机上。不幸的是,这不起作用,因为我需要的路径存储在docker镜像中,因此,当我挂载我的主机到路径,那么它将导致一个空目录。
总结一下,won 't work(注意:我的docker镜像中的java home位于/usr/local/openjdk-8):
1.将以下参数添加到java二进制文件中,以设置卷挂载:

-v "$PWD"/.docker/java/jdk:/usr/local/openjdk-8 \

1.将java.home属性添加到settings.json配置:

"java.home": "${cwd}/.docker/java/jdk",

这将导致类似于:“The java.home configuration doesn 't point to a valid JDK”。
有谁知道:我在这里有什么选择?我可以指向交互式自动删除的docker容器中的目录吗?

  • PS:我不想直接在我的操作系统上安装JDK。*
    更新#1:我设法将一个卷从docker容器挂载到我的主机

1.创建一个新的docker卷:

docker volume create openjdk

1.将卷挂载参数添加到java二进制文件:

-v openjdk:/usr/local/openjdk-8 \

1.运行二进制文件:

java -version

1.将JDK_HOMEJAVA_HOME变量添加到bash环境:

JAVA_HOME="$(docker inspect -f '{{ index .Mountpoint }}' openjdk)"

1.卸载IDE并获取错误.
运行Java扩展需要Java 11或更高版本。请下载并安装最新的JDK。通过配置“java.configuration.runtimes”,您仍然可以使用旧版JDK编译项目
我甚至尝试将java.home属性直接设置为卷的挂载点,这导致了权限拒绝错误,因此我chmod +rx -R了我的整个“var lib docker”目录(存储卷的地方)。最终发生了与上述步骤相同的错误。

b5buobof

b5buobof1#

好吧,我想我只是想出了如何实现它,但我会说这不是最好的方法。因为它基本上与下载jdk并将其放置在某个目录中相同.
1.创建一个docker卷来存储jdk:

docker volume create openjdk-15

1.运行一个包含你想要的jdk的容器(需要是Java 11或更新版本),同时让它填充你刚刚创建的卷:

docker run --rm -v openjdk-15:/usr/local/openjdk-15 openjdk:15-slim java -version

1.(可选)我喜欢符号链接到卷,例如:

sudo ln -s $(docker inspect -f '{{ index .Mountpoint }}' openjdk-15) /usr/local/lib/openjdk-15

1.在settings.json中配置扩展:

"java.home": "/usr/local/lib/openjdk-15",
"java.configuration.runtimes": [
  {
    "name": "JavaSE-15",
    "path": "/usr/local/lib/openjdk-15",
    "default": true
  }
]

因此,不需要自定义的java二进制文件来启动Docker容器。但是,您仍然需要将JDK文件直接存储在操作系统上。

swvgeqrz

swvgeqrz2#

现在可以通过官方的Dev Containers扩展轻松实现这一点。您甚至不需要系统上的现有映像,但如果您想要自定义容器,也可以支持这一点。
我能够在几分钟内通过VS Code使用JDK启动一个容器,所有内容都显示在Docker Desktop中,就像你自己经历了整个过程一样。

相关问题