скрипт bash неожиданный конец файла pterodactyl

#bash #docker

#bash #docker

Вопрос:

Я пытаюсь запустить пользовательское яйцо через панель Pterodactyl, однако я получаю сообщение об ошибке «/entrypoint.sh : строка 30: синтаксическая ошибка: неожиданный конец файла»

Мой образ Docker выглядит следующим образом;

 FROM ubuntu:18.04
MAINTAINER Amelia, <me@amelia.fun>
RUN apt-get update -y
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y dos2unix curl gnupg2 git-core zlib1g-dev libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libcurl4-openssl-dev libffi-dev yarn build-essential gpg-agent zip unzip software-properties-common git default-jre python3-pip python-minimal python-pip ffmpeg libopus-dev libsodium-dev libpython2.7 libpython2.7-dev wget php7.2 php7.2-common php7.2-cli php7.2-fpm
RUN curl -sL https://deb.nodesource.com/setup_10.x -o nodesource_setup.sh
RUN bash nodesource_setup.sh
RUN apt-get install -y nodejs
RUN rm -rf nodesource_setup.sh
RUN adduser -D -h /home/container container
USER container
ENV  USER=container HOME=/home/container
WORKDIR /home/container
COPY ./entrypoint.sh /entrypoint.sh
CMD ["/bin/bash", "/entrypoint.sh"]
  

и мой entrypoint.sh выглядит следующим образом;

 #!/bin/bash
cd /home/container
MODIFIED_STARTUP=`eval echo $(echo ${STARTUP_PARAMETERS} | sed -e 's/{{/${/g' -e 's/}}/}/g')`
rm -rf *
git clone ${REPO_PARAMETERS}
cd */
if grep -q 'Java' AppType
then
    ${STARTUP_PARAMETERS}
if grep -q 'PHP' AppType
then
    ${STARTUP_PARAMETERS}
elif grep -q 'Python2' AppType
then
    [ -f "requirements.txt" ] amp;amp; pip2 install -r requirements.txt ${STARTUP_PARAMETERS} || ${STARTUP_PARAMETERS}
elif grep -q 'Python3' AppType
then
    [ -f "requirements.txt" ] amp;amp; pip3 install -r requirements.txt ${STARTUP_PARAMETERS} || ${STARTUP_PARAMETERS}
elif grep -q 'NodeJS' AppType
then
    npm install
    ${STARTUP_PARAMETERS}
else
    echo "Application not supported"
fi
echo "${MODIFIED_STARTUP}"
  

файл Bash не имеет длины около 30 строк, поэтому я не совсем уверен.

Руководство, которое я использовал, также можно найти здесь

Комментарии:

1. По крайней мере, один fi отсутствует. Взгляните на shellcheck.net

2. Или, на самом деле, if который проверяет, является ли AppType PHP, на самом деле должен быть elif

Ответ №1:

Непосредственная проблема заключается в том, что у вас есть два if оператора, но только один из них закрыт с помощью fi ; мне кажется, что второй должен быть elif . Но есть ряд других вещей, которые кажутся мне плохими идеями:

  • cd команды в сценариях должны (почти) всегда содержать тесты на ошибки — например, если по какой-либо причине произойдет cd /home/container сбой, остальная часть скрипта (включая rm -rf * ) будет выполняться в неожиданном месте. Самоуничтожающаяся среда Docker, возможно, не так важна, как самоуничтожающаяся реальная система, но это все равно не очень хорошо. Я бы использовал что-то вроде этого вместо:

     cd /home/container || {
        echo "Error -- can't move to /home/container, something rotten in Denmark." >amp;2
        exit 1
    }
      

    Аналогичный комментарий относится к cd */ .

  • Следующая строка, которая устанавливает MODIFIED_STARTUP , представляет собой мешанину плохих идей. Я не знаком с тем, что будет в $STARTUP_PARAMETERS , но в целом: используйте $( ) вместо обратных ссылок (а не странное сочетание того и другого). echo $(somecommand) в значительной степени это не операция, просто запустите команду напрямую. Кроме того, ссылки на переменные (и аналогичные расширения, подобные $( ) ) почти всегда должны быть в двойных кавычках (исключение: в правой части присваивания). И eval обычно опасен, и его следует избегать, если это возможно. Если вы приведете мне пример того, как $STARTUP_PARAMETERS выглядит, я, вероятно, мог бы привести очищенную версию этого.

  • У большого if ... elif... etc есть несколько условий, которые делают то же самое, например

     elif grep -q 'Python2' AppType
    then
        [ -f "requirements.txt" ] amp;amp; pip2 install -r requirements.txt ${STARTUP_PARAMETERS} || ${STARTUP_PARAMETERS}
    elif grep -q 'Python3' AppType
    then
        [ -f "requirements.txt" ] amp;amp; pip3 install -r requirements.txt ${STARTUP_PARAMETERS} || ${STARTUP_PARAMETERS}
      

    Исходя из принципа DRY (не повторяйтесь), было бы лучше провести единый тест для всех эквивалентных ситуаций, например, такой:

     elif grep -q 'Python2' AppType || grep -q 'Python3' AppType
    then
        [ -f "requirements.txt" ] amp;amp; pip2 install -r requirements.txt ${STARTUP_PARAMETERS} || ${STARTUP_PARAMETERS}
      

    или даже:

     elif grep -q 'Python[23]' AppType
    then
        [ -f "requirements.txt" ] amp;amp; pip2 install -r requirements.txt ${STARTUP_PARAMETERS} || ${STARTUP_PARAMETERS}
      

    Кстати, использование ${STARTUP_PARAMETERS} без кавычек вызывает у меня здесь предупреждение, но может быть неизбежным — опять же, я не знаю его формата. И amp;amp; ... || конструкция не всегда является безопасной заменой для if then else fi , поскольку она может запускать обе ветви. В этом сценарии, если requirements.txt существует, но pip2 install команда завершается с ошибкой, она также будет запущена ${STARTUP_PARAMETERS} . Это намеренно? Если нет, я бы использовал вместо этого соответствующую if инструкцию.