скрипт bash неожиданный конец файла птеродактиль - PullRequest
0 голосов
/ 21 марта 2019

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

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

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" ] && pip2 install -r requirements.txt ${STARTUP_PARAMETERS} || ${STARTUP_PARAMETERS}
elif grep -q 'Python3' AppType
then
    [ -f "requirements.txt" ] && 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 Ответ

2 голосов
/ 21 марта 2019

Непосредственная проблема состоит в том, что у вас есть два 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." >&2
        exit 1
    }
    

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

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

  • Большой if ... elif... и т. Д. Имеет несколько условий, которые делают то же самое, например,

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

    По принципу СУХОЙ (не повторяйте себя) было бы лучше иметь один тест для всех эквивалентных ситуаций, например:

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

    или даже:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...