@viig

Почему при старте docker контейнера sh скрипт запускается как node приложение?

Всем привет )

Есть следующий Dockerfile:
FROM node:16-alpine

ENV PORT=5014
ENV NODE_ENV=development
ENV DATABASE_PORT=3306

WORKDIR /usr/src/app

RUN apk update && apk add bash tini tzdata
RUN cp /usr/share/zoneinfo/Europe/Moscow /etc/localtime \
    && echo "Europe/Moscow" > /etc/timezone

RUN wget https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh
RUN chmod a+x wait-for-it.sh

COPY package*.json ./
COPY ["src", "./src"]
COPY ["test", "./test"]
RUN npm ci
RUN chmod a+x src/start.sh

EXPOSE 8080

CMD ["src/start.sh"]

Соответвенно при старте контейнера запускается src/start.sh следующего содержания:
#!/bin/bash

set -e

./wait-for-it.sh "food_calc_mysql:${DATABASE_PORT}" --timeout=1 -- echo "Database is up"

if [[ ${NODE_ENV} == 'development' ]]; then
  exec npx nodemon --exec "node ./src/bin/www"
else
  echo "NODE_ENV is not set"
  exit 1
fi

и возникает такая ошибка:
/usr/src/app/src/start.sh:5
./wait-for-it.sh "food_calc_mysql:${DATABASE_PORT}" --timeout=1 -- echo "Database is up"
 ^

SyntaxError: Unexpected token '/'
    at Object.compileFunction (node:vm:352:18)
    at wrapSafe (node:internal/modules/cjs/loader:1031:15)
    at Module._compile (node:internal/modules/cjs/loader:1065:27)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
    at Module.load (node:internal/modules/cjs/loader:981:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
    at node:internal/main/run_main_module:17:47

то есть скипт src/start.sh запускается как node.js приложение, а не как bash скрипт. Не пойму почему так происходит.

Спасибо.
  • Вопрос задан
  • 155 просмотров
Решения вопроса 1
Lynn
@Lynn
nginx, js, css
В базовом образе в качестве ENTRYPOINT задан вот это скрипт.

В частности в нём написано, что если команда не похожа на исполняемую, то предполагается что это JS который нужно выполнить нодой.

В вашем случае, наверное самое простое, задать полный путь к файлу в CMD
CMD ["/usr/src/app/src/start.sh"]
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@MadridianFox
Web-программист, многостаночник
Скорее всего в базовом образе, который вы используете, настроен ENTRYPOINT, который превращает вашe src/start.sh в node src/start.sh или типа того.

Посмотрите что именно прописано в ENTRYPOIN и подстройтесь или замените его.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы