我想在docker容器中运行Java Spring应用程序,这个应用程序应该能够部署兄弟容器。当我直接在我的机器上运行Java应用程序时它工作正常并且可以部署容器,但是当我尝试在容器内运行应用程序时它就不再起作用了(我使用supervisord来运行mongodb和Java Spring应用程序)一个容器,我知道这不是最好的做法)。容器启动正常,但是一旦我的应用程序尝试连接到docker deamon而没有来自Java的任何堆栈跟踪,只是错误WARN received SIGTERM indicating exit request
崩溃。 supervisord日志不包含其他信息。
我尝试使用-v /var/run/docker.sock:/var/run/docker.sock
将Docker socket从主机(带有Docker Desktop的Windows 10 Pro,也尝试使用Ubuntu Server 18.04)安装到容器中。我也试过用--net="host"
。两者都不起作用,虽然第二个容器没有崩溃,但产生了一个不同的错误({}->unix://localhost:80: Connection refused
)在我的java应用程序的日志中可见,这表明它甚至无法为deamon找到正确的地址。我还激活了“在没有TLS的tcp:// localhost:2375上暴露deamon”。我还尝试将容器内的DOCKER_HOST环境变量设置为默认值,例如“tcp:// localhost:2375”或“/var/run/docker.sock”。
这是我用来初始化docker客户端的代码。
DockerClient docker = DefaultDockerClient.fromEnv().build();
DefaultDockerClient.fromEnv().build();
应该创建一个docker客户端,它使用DOCKER_HOST环境变量连接到主机或默认地址(* NIX上的“/var/run/docker.sock”)。
这是我的DOCKERFILE:
FROM openjdk:8-jre-alpine
ENV PACKAGES mongodb supervisor
VOLUME /opt/server
VOLUME /data/db
WORKDIR /opt/accservermanager
ADD supervisord.conf /etc/supervisor.conf
ADD accservermanager.jar /opt/accservermanager/accservermanager.jar
ADD application.properties /opt/accservermanager/application.properties
RUN apk update && \
apk add --update $PACKAGES --no-cache && \
rm -rf /var/cache/apk/*
EXPOSE 8000
CMD ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisor.conf"]
最后,我的supervisord.conf
[supervisord]
user=root
stderr_logfile=/var/log/supervisord.err.log
stdout_logfile=/var/log/supervisord.out.log
loglevel=debug
[program:mongodb]
command=mongod --smallfiles
autostart=true
autorestart=true
stderr_logfile=/var/log/mongo.err.log
stdout_logfile=/var/log/mongo.out.log
[program:accservermanager]
directory=/opt/accservermanager/
command=java -jar accservermanager.jar
autostart=true
autorestart=true
stderr_logfile=/var/log/accservermanager.err.log
stdout_logfile=/var/log/accservermanager.out.log
预期结果:应用程序从主机连接到docker客户端,并且能够在主机上部署/管理容器
实际结果:容器崩溃或输出错误。
事实证明,有一个新版本的spotify-docker解决了我的问题。从v8.15.1
更新到v8.15.2
解决了我的问题。