Я хочу запустить приложение Java Spring внутри контейнера докеров, и это приложение должно иметь возможность развертывать одноуровневые контейнеры. Когда я запускаю приложение Java непосредственно на своем компьютере, оно работает нормально и может развертывать контейнеры, но как только я пытаюсь запустить приложение внутри контейнера, оно больше не работает (я использую supervisord для запуска приложения mongodb и Java Spring в один контейнер, и я знаю, что это не лучшая практика). Контейнер запускается нормально, но вылетает, как только мое приложение пытается подключиться к демону докера без каких-либо трассировок стека из Java, просто ошибка WARN received SIGTERM indicating exit request. Журналы супервизора не содержат дополнительной информации.
Я попытался установить сокет Docker с хоста (Windows 10 Pro с Docker Desktop, также пробовал Ubuntu Server 18.04) в контейнер с помощью -v /var/run/docker.sock:/var/run/docker.sock.
Я также пытался использовать --net = "host".
Оба не сработали, хотя со вторым контейнер падает нет, но выдает другую ошибку ({}->unix://localhost:80: Connection refused), видимую в журнале моего java-приложения, которая указывает на то, что он даже не может найти правильный адрес для демона.
Я также активировал «Разоблачение демона на tcp://localhost: 2375 без TLS».
Я также попытался установить для переменной среды DOCKER_HOST внутри контейнера значения по умолчанию, такие как «tcp://localhost:2375» или «/var/run/docker.sock».
Вот код, который я использую для инициализации клиента докера.
DockerClient docker = DefaultDockerClient.fromEnv().build();
DefaultDockerClient.fromEnv().build(); должен создать клиент докера, который использует переменную среды DOCKER_HOST для подключения к хосту или адресу по умолчанию («/var/run/docker.sock» в *NIX).
Вот мой 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
Ожидаемый результат: приложение подключается к док-клиенту с хоста и может развертывать/управлять контейнерами на хосте.
Фактический результат: Контейнер аварийно завершает работу или выводит ошибки.




Оказывается, есть новая версия Spotify-Docker, которая решает мою проблему.
Обновление с v8.15.1 на v8.15.2 решило мою проблему.