Можем ли мы передать ARG в CMD в DockerFile? - PullRequest
0 голосов
/ 22 января 2019

Как я могу передать переменную ENV при использовании команды docker run, а также Можете ли вы сказать мне, правильно ли я передаю переменную ENV в CMD?

Главное, чего я хочу добиться, - это загрузить свой код на gitlab и создать образ докера, чтобы я мог создать контейнер для веб-приложения.В этом коде у нас есть файл Core.js, который принимает 2 аргумента 1. Название организации и номер порта.Для этого мне нужно запустить узел Core.js Org1 1401, узел Core.js Org2 1402 и т. Д. Есть сценарий оболочки, который извлекается через файл Docker, мне нужно дать имя этого файла в качестве аргумента, чтобы он должен использоватьтот же образ докера, но я могу создать несколько контейнеров для другой организации

FROM alpine

LABEL MAINTAINER "CoE"
WORKDIR /

ARG proxy
ARG username
ARG pswd
ENV ORG_SCRIPT

RUN export http_proxy=$proxy                                                                    && \
    export https_proxy=$proxy                                                                   && \
    git clone -b master https://$username:$pswd@git.devops.company.net/dlr_ui         && \
    npm install                     

 EXPOSE 1401 1402 1403 1404 1405 1406 1407 1408
 WORKDIR /applications/package/ui_servers 
CMD ["sh","./${ORG_SCRIPT}"]    // It is not getting the script name over here. Can you tell if it is correct way or not. OR i should do:
CMD ["sh","./$ORG_SCRIPT"]

I'm getting error for both. Value is not coming to that variable.

Buid:
 docker build --no-cache --build-arg proxy=$http_proxy --build-arg username=dfadf--build-arg pswd=dsfadsf --build-arg -t uinodetest .


RUN:
docker run  -d -it -p 1401:1401 -e ORG_SCRIPT runOrg1.sh --name="Org1_UI" uinodetest

OR Other method i'm using is

FROM alpine

LABEL MAINTAINER "CoE"
WORKDIR /

ARG proxy
ARG username
ARG pswd
ENV ORG_NAME
ENV ORG_PORT

RUN export http_proxy=$proxy                                                                    && \
    export https_proxy=$proxy                                                                   && \
    git clone -b master https://$username:$pswd@git.devops.company.net/dlr_ui         && \
    npm install                     

 EXPOSE 1401 1402 1403 1404 1405 1406 1407 1408
 WORKDIR /applications/package/ui_servers 
CMD ["node","Core.js","$ORG_NAME","ORG_PORT"]



Buid:
 docker build --no-cache --build-arg proxy=$http_proxy --build-arg username=dfadf--build-arg pswd=dsfadsf --build-arg -t uinodetest .


RUN:
docker run  -d -it -p 1401:1401 -e ORG_NAME ORG1 -r ORG_PORT 1401 --name="Org1_UI" uinodetest

Скажите, если я что-то упустил или мой синтаксис неправильный.

Ответы [ 3 ]

0 голосов
/ 22 января 2019

Здесь есть пара движущихся частей.

Для вещей, которые необходимо настроить, вероятно, проще всего сослаться на них, используя 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
0 голосов
/ 22 января 2019

Docker передает переменную окружения вашему контейнеру, но вам нужна оболочка для синтаксического анализа синтаксиса ${var} в этой переменной.Вы приблизились к:

CMD ["sh","./${ORG_SCRIPT}"]

Я подозреваю, что причина, по которой это не сработало, состоит в том, что аргумент, переданный в sh, еще не был расширен, и sh не обрабатывает этот аргумент, это простозапустить его.Вместо этого вам нужно:

CMD ["sh","-c","./${ORG_SCRIPT}"]

Это почти точно так же, как синтаксис строки / оболочки, который я рекомендовал бы вместо:

CMD ./${ORG_SCRIPT}
0 голосов
/ 22 января 2019

Я думаю, что лучший подход будет использовать ENTRYPOINT, а затем добавить CMD для выполнения help или что-то подобное

ENTRYPOINT ["node","Core.js"]
CMD ["--help"]

Затем при запуске контейнера передайте ему $ORG_NAME и $ORG_PORT. В этом случае docker сохранит вашу точку входа и переопределит значение по умолчанию CMD, которое в данном случае равно --help, другим переданным вами параметрам и убедитесь, что команда между кавычками будет рассматриваться как одна команда

Таким образом, в этом случае вы запустите контейнер следующим образом:

docker run -it --name my_container myimage:latest "$ORG_NAME $ORG_PORT"

Тот же сценарий можно выполнить с помощью docker compose.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...