Как использовать переменную внутри CMD в файле dockerfile?

#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 Хм… Но это работает на меня. Не понимаю этого.