#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.net2. Или, на самом деле,
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
инструкцию.