Потратив слишком много времени на это и прочитав множество справочных материалов по докеру и множество статей о переполнении стека, я должен признать поражение и обратиться за помощью к панели.
Чего я хочу добиться, так это определить мой NODE_ENV где-то за пределами файлов докеров, чтобы его можно было .gitignored.
Поэтому я хочу иметь файл .env в том же каталоге верхнего уровня вместе с docker-compose.yml и Dockerfile, который содержит запись для NODE_ENV.
Звучит довольно прямолинейно?
Во-первых, у меня были проблемы с оператором CMD в файле докеров. Изучив его, я обнаружил, что мне нужно сделать что-то вроде этого
FROM node:latest
ENV NODE_ENV=development
WORKDIR /usr/src/app
COPY ./package*.json /usr/src/app/
RUN npm install
ADD . .
CMD ["sh", "-c", "npm run start:${NODE_ENV}"]
EXPOSE 3001
Он работает как шарм, затем я запускаю его из командной строки с помощью
docker run -e "NODE_ENV=разработка" .
Однако добавьте в уравнение docker-compose, и все пойдет не так. И это тоже не дает много ошибок.
version: '3'
services:
app:
build: .
environment:
- NODE_ENV=$NODE_ENV
ports:
- '80:3001'
links:
- mongodb
mongodb:
image: mongo
ports:
- '27017:27017'
Теперь, если я запущу это с помощью конфигурации docker-compose, я увижу, что переменная среды установлена правильно.
services:
app:
build:
context: /home/me/myproject
environment:
NODE_ENV: development
links:
- mongodb
ports:
- 80:3001/tcp
mongodb:
image: mongo
ports:
- 27017:27017/tcp
version: '3.0'
Итак, мой вопрос в основном, может ли кто-нибудь определить, что я делаю неправильно? Или это ошибка в докере, о которой я должен сообщить?
Единственные подсказки, данные из журналов,
app_1 exited with code 2
и в журнале контейнера
/bin/sh: 1: [: npm run ,: unexpected operator