Docker run использует хост PATH при связывании команд - PullRequest
0 голосов
/ 05 ноября 2019

Я написал образ, который объединяет утилиты для запуска команд с использованием нескольких CLI. Я хочу запустить его как исполняемый файл следующим образом:

docker run my_image cli command

Где CLI - это мой пользовательский CLI, а команда - это команда для этого CLI.

При сборкемой образ У меня есть следующая инструкция в Dockerfile:

ENV PATH="/cli/scripts:${PATH}"

Вышеприведенное сработает, если я не чередую команды с контейнером. Если я объединяю команды в цепочку, они перестают работать:

docker run my_image cli command && cli anothercommand

Command 'cli' not found, but can be installed with...

Там, где первая команда работает, а другая не работает.

Таким образом, логический вывод заключается в том, что cli отсутствует в пути. Я попытался проверить это с помощью:

docker run my_image printenv PATH

Это на самом деле выводит PATH контейнеров, и все выглядит хорошо. Поэтому я попытался также связать эту команду:

docker run my_image printenv PATH && printenv PATH И, конечно же, это выводит сначала PATH для контейнеров, а затем PATH моей системы.

В чем причина этого? Как мне обойти это?

1 Ответ

1 голос
/ 05 ноября 2019

Когда вы вводите команду в вашу оболочку, ваша локальная оболочка сначала обрабатывает ее, прежде чем какая-либо команда будет запущена. Он видит (переформатирован)

docker run my_image cli command \
  && \
cli anothercommand

То есть оболочка вашего хоста получает &&, поэтому хост сначала запускает docker run, а затем cli anothercommand (если контейнер успешно завершился).

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

docker run my_image sh -c 'cli command && cli anothercommand'

Если это более чем случайное использование, такжерассмотрите возможность записи этого в сценарий оболочки

#!/bin/sh
set -e
cli command
cli another command

COPY сценарий в образ вашего Docker, и тогда вы сможете docker run my_image cli_commands.sh или что-то подобное.

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