使用ssh和sshfs实现容器内目录的反向映射
docker支持把「主机」上的目录映射到「容器」内部,但并不支持,反方向的映射,即「容器」内的目录映射到「主机」。
本文介绍一种「反向映射」的方法:通过ssh服务,和macos上面的sshfs工具,把容器内部的目录挂装到主机。
包含ssh服务的容器
首先准备一个容器:
这个容器包含hibernate源代码项目和编译好的相关jar文件,并且包含「ssh服务」。把这个项目使用git clone命令下载到本地:
$ git clone https://github.com/alchemy-studio/docker-hibernate-build.git
clone完项目以后,需要安装java环境。
安装java
使用sdkman安装java:
$ sdk install java 11.0.3.hs-adpt
$ sdk use java 11.0.3.hs-adpt
$ java -version
下面是运行结果:

启动容器
启动容器,注意容器会启动postgresql服务,要停掉host的本地postgresql服务:
$ pg_ctl -D /usr/local/var/postgres stop
停掉本地服务以后,运行下面的命令:
$ docker-compose -f docker-compose-production.yml up
下面是运行结果:

在host连接容器的数据库试试看,连接数据库时候,foo_usr的密码是foo:
$ psql -U foo_usr -h localhost foo_db
下面是运行结果:

如上所示,可以在host这边通过端口访问容器的数据库。
测试容器的ssh连接
查看容器映射出来的ssh服务的接口:
$ docker ps
下面是运行结果:

如上所示,映射出来的端口是32773。使用ssh登录试试看:
$ ssh root@localhost -p 32773
命令的执行过程和结果:

如上所示,成功登录。注意root的登录密码是foo。
准备host的挂装目录
在「主机」这边创建一个工作目录,用于挂装「容器内」的目录:
$ sudo mkdir /work
然后设置目录owner:
$ sudo chown `whoami` /work
命令的运行过程和结果:

这个目录准备好以后,接下来就是安装sshfs,用来将容器内的目录挂装到host的这个/work目录里面。然后要在docker的配置里面,把/work目录的共享权限加上:

这样「主机」这边的准备工作就完成了。
安装sshfs,挂装容器内部的hibernate工程目录至host
通过ssh挂装容器里的目录至host,需要安装sshfs:
$ brew install sshfs
安装好以后,使用sshfs挂装容器目录(注意每次容器重新启动,端口号会变):
$ sshfs -p 32768 root@localhost:/work /work
第一次挂装的时候,MacOS会弹出安全设置的提示,允许sshfs的权限操作就可以了。点击Open System Preferences:

点击「允许」:

此时再重新执行挂装命令就可以了:

如果挂装成功,可以看到host的/work目录里面已经是挂装了容器里面的work目录了:
$ ls /work
命令的执行过程和结果:

可以看到容器里面的hibernate-orm这个容器里面的目录被挂装到host了:

以上就是容器目录的反向挂装过程。接下来我们可以在「主机」这边使用挂装出来的目录和里面的文件数据。
在intellij当中加载项目
接下来就可以用intellij在host这边加载这个目录了。第一步是在intellij里面加载hibernate-orm这个项目:

注意上面的Gradle JVM设置sdkman的当前jvm,其他的配置保持不变。点击ok加载项目,此时intellij会花一些时间加载和配置项目:

等待加载过程完成,打开MigrationTest并运行其中一个测试:

耐心等待测试运行出结果,第一次运行会失败:

可以看到是默认的language level设置不对,使用intellij的自动fix功能就可以解决这个问题:

点击上面intellij给出的Set language to 9,然后等待设置处理完成即可。此外还有一处需要设置,打开intellij的preferences:

如上所示,进入Java Compiler的设置,全选所有Per-module bytecode version里面的配置,点击-,删掉所有配置,然后点击Apply:

设置完成后,重新运行测试:

耐心等待测试完成,测试编译过程比较慢:

最终得到测试结果:

以上就是这个容器的完整使用方法,后续可以用这个容器做各种hibernate源代码的学习,分析,测试。
开发模式
这个容器支持开发模式的docker-compose配置,使用下面的命令启动容器:
$ docker-compose -f docker-compose-development.yml up
登录容器
如果需要登录容器进行调试,使用下面的命令即可:
$ docker exec -it docker-hibernate-build_default_1 bash
以上就是要介绍的内容。