#docker #dockerfile
Вопрос:
Как вы можете видеть в этом файле Dockerfile, я передаю номер порта, как --build-arg
и во время сборки. Теперь мне нужно бежать npx next start -p ${PORT}
:
FROM node:16.6.1-alpine3.14
RUN apk add dumb-init
ARG PORT
EXPOSE $PORT
ENTRYPOINT ["/usr/bin/dumb-init", "--"]
CMD ["npx", "next", "start", "-p", "echo ${PORT}"]
Но это не работает. Приложение работает на порту 3000 по умолчанию. Если я это сделаю
CMD ["npx", "next", "start", "-p", "3100"]
Приложение работает на 3100, как и ожидалось. Но почему я не могу использовать переменную?
Ответ №1:
Формат, который вы используете ( exec
), не будет работать. Из документов:
форма exec не вызывает командную оболочку. Это означает, что обычной обработки оболочки не происходит.
Вместо этого вы можете выполнить оболочку напрямую:
CMD ["sh", "-c", "npx next start -p $PORT"]
Комментарии:
1. В чем разница, чтобы установить ENV?
ENV portValue=$PORT
иCMD ["npx", "next", "start", "-p", "${portValue}"]
2. Но использование env, как я показал в комментарии, работает, и ваше решение не работает, хотя я понимаю ваш код…
3. Когда вы говорите, что это не работает … вы получаете сообщение об ошибке?
4. Если вы используете
sh -c
, вся команда должна быть в следующем слове оболочки;CMD ["sh", "-c", "npx next start ..."]
. Но Docker может вставитьsh -c
оболочку для васCMD npx next start ...
; обычно вам не нужно указыватьsh -c
ее в файле Dockerfile.5. @DavidMaze Правильно, конечно, спасибо, Дэвид
Ответ №2:
Установите переменную env и используйте ее в CMD:
ARG PORT
ENV portValue=$PORT
CMD ["npx", "next", "start", "-p", "${portValue}"]
Комментарии:
1. С синтаксисом exec нет оболочки для расширения этой переменной.
2. @BMitch Хм… Но это работает на меня. Не понимаю этого.