Здесь есть пара движущихся частей.
Для вещей, которые необходимо настроить, вероятно, проще всего сослаться на них, используя process.env
в Node и not , передавая их в качестве аргументов командной строки. Во втором примере, например, обратитесь к process.env.ORG_NAME
.
Некоторые вещи не нужно настраивать. Во втором примере вы можете выбрать фиксированный порт TCP для вашей службы; даже если вы используете экспресс-порт по умолчанию 3000, вы можете docker run -p 1401:3000
, docker run -p 1402:3000
, и т. д. , чтобы назначать разные порты разным контейнерам с одним и тем же образом. В первом примере вы пытаетесь использовать переменную окружения, чтобы указать всю команду; не беспокойтесь об этом и просто используйте стандартную командную строку Docker.
Это даст вам обычный Dockerfile, такой как
FROM node:alpine
# Generally don't "git clone" in a Dockerfile.
WORKDIR /dlr_ui
COPY package.json package-lock.json ./
RUN npm install
COPY . ./
EXPOSE 3000
CMD ["node", "Core.js"]
И вам совсем не нужно беспокоиться об этой конкретной проблеме. Вы бы запустили это как
docker run -d -p 1401:3000 -e ORG_NAME=ORG1 --name="Org1_UI" uinodetest
Для команд CMD, ENTRYPOINT и RUN существует два синтаксиса. Форма, которая выглядит как массив JSON (но на самом деле это не так), непосредственно запускает данную команду, не вызывая никакой оболочки или интерпретатора или расширения переменной. Во втором примере скрипт будет вызываться с литеральными строками $ORG_NAME
и ORG_PORT
в качестве параметров. Если вы просто напишите что-то, похожее на команду, без использования синтаксиса JSONish, оно автоматически будет заключено в sh -c
.
Я бы ожидал, синтаксически, что первый пример делает то, что вы хотите (но смотрите ответ @ BMitch); но было бы проще просто передать команду напрямую
docker run -d -p 1401:1401 --name="Org1_UI" uinodetest ./runOrg1.sh