Docker: Как добавить переменную в ENTRYPOINT в Dockerfile - PullRequest
0 голосов
/ 02 мая 2020

При добавлении переменной к docker ENTRYPOINT сборка docker прошла успешно. Но при запуске образа docker появляется следующее сообщение об ошибке

$> sudo docker run f7edbecba608 .

   .: 1: .: [/usr/lib/dart/bin,: not found

Однако, когда переменная не помещается в файл Docker, она может успешно создать и запустить образ.

Что такое разница с и без переменной в ENTRYPOINT.

Ниже моя Dockerfile

FROM google/dart

WORKDIR /sample_dir

ADD . /sample_dir

WORKDIR /sample_dir/project

RUN pub get

ARG REDIS_HOST

ENV MY_ENV = $REDIS_HOST

ENTRYPOINT ["/usr/lib/dart/bin", "./bin/main.dart", $REDIS_HOST]

Команда, использованная для создания образа:

sudo docker build --build-arg "REDIS_HOST=127.0.0.1" 

Пожалуйста, дайте мне знать, требуются ли другие детали. Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 02 мая 2020

Вы должны установить переменные во время создания контейнера или службы

docker run -e REDIS_HOST=127.0.0.1

и использовать их

Map<String, String> envVars = Platform.environment;
print(envVars['REDIS_HOST']);

или вы можете определить имя хоста

docker run --add-host redis_host=127.0.0.1

, и вы можете тест ping redis_host

0 голосов
/ 02 мая 2020

ENTRYPOINT должен быть либо действительным массивом JSON, либо он интерпретируется как строка. В вашем случае переменная $REDIS_HOST не является строкой JSON в кавычках, так что это интерпретируется как форма оболочки, и в результате вы получаете

ENTRYPOINT sh -c '["/usr/bin/dart", "./bin/main.dart", $REDIS_HOST]'

, что напрямую приводит к ошибке, которую вы получение (первое слово этой команды после обработки двойных кавычек - [/usr/bin/dart,, и это недопустимая команда).

Если вам нужно включить такие вещи, как раскрытие переменных среды, вы должны использовать форму оболочки эти команды, а не форма JSON -array.

CMD /usr/bin/dart ./bin/main.dart $REDIS_HOST

Как @GigaKokaia предлагает в их ответ вы, вероятно, хотите, чтобы эта переменная была переменной среды выполнения, а не Аргумент времени сборки (вы не хотите перестраивать образ при каждом развертывании в другой среде; кластерные и облачные настройки будут иметь разные имена хостов), но с этой формой $REDIS_HOST не будет оцениваться до тех пор, пока docker run -e настройки переменных среды обрабатываются. Вы также можете заставить ваше приложение напрямую искать переменную окружения $REDIS_HOST, а не передавать ее в качестве параметра.

0 голосов
/ 02 мая 2020

Путь здесь для dart является проблемой. Правильный путь должен быть /usr/bin/dart - Официальная ссылка.

Вы можете обновить ENTRYPOINT следующим образом:

FROM google/dart

WORKDIR /sample_dir

ADD . /sample_dir

WORKDIR /sample_dir/project

RUN pub get

ARG REDIS_HOST

ENV MY_ENV = $REDIS_HOST

ENTRYPOINT ["/usr/bin/dart", "./bin/main.dart", $REDIS_HOST]

Предполагая, что main.dart существует внутри /sample_dir/project/bin/main.dart на основе вашего Dockerfile.

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