docker容器执行宿主机中的shll脚本

各位大佬,遇到个很棘手的问题,我写了个java程序在docker容器中运行,但是我这个程序中有用Runtime.getRuntime().exec()去执行宿主机上的shell脚本,这个脚本是用来启动docker-compose.yml文件,但因为一个是在docker中运行,一个又是在宿主机上的文件,导致访问不到,我在网上看到用sshpass的,但这个方式并不安全,很容易暴露宿主机密码,还有没有别的更好的办法做到啊?

  • 有好几个解决方法,你可以在Docker容器内部运行一个Docker守护进程,从而在容器中运行其他Docker容器。这样,Java程序就能够使用Docker命令来运行容器中的命令,而无需访问宿主机。

  • 或者使用volume映射:

docker run -v /my-scripts:/scripts myimage
Runtime.getRuntime().exec("/scripts/myscript.sh");
  • 第三种方法,使用RESTful API。就是在宿主机上创建一个RESTful API,然后在Java程序中通过HTTP协议调用该API来执行宿主机上的shell脚本。
from flask import Flask
import subprocess

app = Flask(__name__)

@app.route('/execute')
def execute_script():
    subprocess.call(['/path/to/myscript.sh'])
    return 'Script executed successfully'

if __name__ == '__main__':
    app.run()


然后在Java程序中,使用HttpClient来调用这个API:

HttpClient httpClient = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("http://localhost:5000/execute"))
        .build();
HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());


不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^