Докер: использование экрана для выключения сервера майнкрафт через cron не работает - PullRequest
0 голосов
/ 19 декабря 2018

Я хочу использовать докер для сервера майнкрафт.Дело в том, что мне нужно правильно его выключать, чтобы спасать мир каждые 24 часа.И чтобы сделать вещи более сложными: люди на сервере должны быть проинформированы об этом.

Так что моя идея заключалась в использовании «screen» в сочетании с «cron»:

################################
### We use a java base image ###
################################
FROM openjdk:8 AS build

MAINTAINER me <me@me.com>

#################
### Arguments ###
#################
ARG PAPERSPIGOT_CI_URL=https://papermc.io/ci/job/Paper-1.13/lastSuccessfulBuild/artifact/paperclip.jar

##########################
### Download paperclip ###
##########################
ADD ${PAPERSPIGOT_CI_URL} /opt/minecraft/server/paperclip.jar

############################################
### Run paperclip and obtain patched jar ###
############################################
RUN cd /opt/minecraft/server/ \
    && java -jar paperclip.jar; exit 0

RUN cd /opt/minecraft/server/ \
    && mv cache/patched*.jar paperspigot.jar

###########################
### Running environment ###
###########################
FROM anapsix/alpine-java:latest

###########################
### Install screen      ###
###########################
RUN apk --update add screen

#########################
### Working directory ###
#########################
WORKDIR /data

###########################################
### Obtain runable jar from build stage ###
###########################################
COPY --from=build /opt/minecraft/server/paperspigot.jar /opt/minecraft/server/paperspigot.jar

########################
### Obtain starth.sh ###
########################
ADD start.sh /opt/minecraft/server/start.sh

########################
### Obtain restart.sh ###
########################
ADD restart.sh /opt/minecraft/server/restart.sh

###########################################
### Configure and run cron              ###
###########################################
COPY crontab /etc/cron/crontab
# Init cron
RUN crontab /etc/cron/crontab

CMD ["crond", "-f"]

###############
### Volumes ###
###############
VOLUME "/data"

#############################
### Expose minecraft port ###
#############################
EXPOSE 25565

######################################
### Entrypoint is the start script ###
######################################
WORKDIR /data
ENTRYPOINT sh /opt/minecraft/server/start.sh

Это скрипт start.sh, который работает:

#/bin/sh
cd /data
/usr/bin/screen -S minecraft /opt/jdk1.8.0_192/jre/bin/java -jar -Xms800M -Xmx800M -Dcom.mojang.eula.agree=true /opt/minecraft/server/paperspigot.jar
screen -ls

Это скрипт перезапуска, запускаемый через crontab.Я думаю, что это никогда не начинается:

#!/bin/sh
# me - V1.1 - 18.05.2018
# Minecraft Server restart
screen -Rd minecraft -X stuff "say Server is restarting in 30 seconds! $(printf '\r')"
sleep 23s
screen -Rd minecraft -X stuff "say Server is restarting in 7 seconds! $(printf '\r')"
sleep 1s
screen -Rd minecraft -X stuff "say Server is restarting in 6 seconds! $(printf '\r')"
sleep 1s
screen -Rd minecraft -X stuff "say Server is restarting in 5 seconds! $(printf '\r')"
sleep 1s
screen -Rd minecraft -X stuff "say Server is restarting in 4 seconds! $(printf '\r')"
sleep 1s
screen -Rd minecraft -X stuff "say Server is restarting in 3 seconds! $(printf '\r')"
sleep 1s
screen -Rd minecraft -X stuff "say Server is restarting in 2 seconds! $(printf '\r')"
sleep 1s
screen -Rd minecraft -X stuff "say Server is restarting in 1 second! $(printf '\r')"
sleep 1s
screen -Rd minecraft -X stuff "say Closing server...$(printf '\r')"
screen -Rd minecraft -X stuff "stop $(printf '\r')"
sleep 15s
# echo "Updating to most recent paperclip version."
# wget -q https://papermc.io/ci/job/Paper-1.13/lastSuccessfulBuild/artifact/paperclip.jar -O /home/pi/minecraft/paperclip.jar
echo "Restarting now."
/opt/minecraft/server/start.sh

Это crontab, который должен запускать restart.sh каждые 5 минут.Не бывает:

*/5 * * * * /opt/minecraft/server/restart.sh

Возможно, это неправильный способ сделать это.Может быть, есть гораздо лучший способ как-то подключиться к экранной сессии или как-то перезагрузить сервер с сообщением.Но я не нашел ничего в Интернете.Есть идеи?

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

после некоторого тестирования и чтения я пришел к выводу, что использование cron внутри контейнера - неправильное решение.

Я запускаю и перезапускаю контейнер докера с докером.Так как это так быстро, мне не нужно сообщать о ppl на сервере.И сервер правильно останавливается.

0 голосов
/ 19 декабря 2018

Здесь возможны две проблемы:

  1. возможно, демон cron не установлен в образе Docker, и
  2. может возникнуть проблема с поиском исполняемых файлов в задании cronваш Docker-контейнер

Что касается первого, я не вижу ничего устанавливающего cron в вашем Dockerfile.Вы, вероятно, хотите проверить используемый вами базовый образ - я знаю, что мне пришлось установить его на образ Ubuntu, который я создал некоторое время назад.

Что касается второй проблемы, то, что нужно запускать задания вваш crontab в том, что окружающая среда не такая, как вы ожидаете.В частности, переменная $PATH, используемая оболочкой для поиска команд, которые вы хотите выполнить, не задана.В результате многие команды просто не работают, потому что оболочка не знает, где их найти.

«Быстрый и грязный» способ исправить это - убедиться, что в вашем файле установлена ​​переменная $PATH.crontab, добавив следующую строку:

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

См. этот ответ для получения более подробной информации.

...