'docker run' игнорирует первую команду, добавленную к ENTRYPOINT ["/ bin / bash", "-c", ". foo.sh"], но не ["bash", "foo.sh"] - PullRequest
3 голосов
/ 02 июля 2019

Я пытаюсь запустить образ докера, который выполняет сценарий bash и передает аргументы времени выполнения этому сценарию bash.Я обнаружил, что когда я строю образ с использованием рекомендованной точки входа ENTRYPOINT ["/bin/bash", "-c", ". foo.sh"], первый аргумент, добавленный к команде docker run, не воспринимается моим сценарием, но когда я строю образ с ENTRYPOINT ["bash", "foo.sh"], он делает.

Игрушечная версия сценария оболочки выглядит следующим образом:

#!/bin/bash

echo you got "$#" args
ARG1=${1:-foo}
ARG2=${2:-bar}
ARG3=${3:-1}
ARG4=${4:-$(date)}

echo "$ARG1"
echo "$ARG2"
echo "$ARG3"
echo "$ARG4"

, поэтому в основном сценарий ожидает до 4 аргументов командной строки, каждый из которых имеет значения по умолчанию.

Исходный Dockerfile, который я попробовал, выглядит следующим образом:

FROM ubuntu

COPY foo.sh foo.sh

ENTRYPOINT ["/bin/bash", "-c", ". foo.sh"]

и основан на ряде ресурсов, которые я нашел для того, как правильно выполнить сценарий оболочки, используя форму ENTRYPOINT 1014 * exec * рекомендовано docker .

После построения этого изображения с помощью docker build -t foo ., я запускаю его с docker run -it foo first second third fourth и получаю следующий вывод:

you got 3 args
second
third
fourth
Tue Jul  2 13:14:52 UTC 2019

, поэтому ясно, что первыйАргумент, добавленный к команде docker run, сбрасывается где-то вдоль строки, и единственные аргументы, которые попадают в команду shell, - это второй, третий и четвертый.

Я потратил целую вечность, пытаясь диагностировать проблему, и до сих пор не понял, почему это происходит.Лучшее, что я придумала, это какой-то хакерский обходной путь, после того, как я обнаружил, что изменение точки входа просто на ENTRYPOINT ["bash", "pilates.sh"] дает желаемые результаты.

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

Ответы [ 2 ]

4 голосов
/ 02 июля 2019

Когда вы запускаете bash -c 'something' foo bar baz, "foo" становится параметром zero'th (т. Е. $0)

Вам необходимо вставить фиктивный параметр, возможно,

ENTRYPOINT ["/bin/bash", "-c", ". foo.sh", "bash"]

Это описано в справочной странице bash, в описании опции -c.

3 голосов
/ 02 июля 2019

Контейнер Docker запускает один процесс, указанный в вашем случае настройкой ENTRYPOINT;когда этот процесс выходит, контейнер выходит.Здесь это означает, что нет окружающей среды оболочки, которую вам нужно обновить, поэтому вам не нужно запускать ваш скрипт, используя встроенный .;и как только вы просто запускаете простую команду, вам также не нужно помещать ее в оболочку sh -c.

, что приводит к созданию файла Docker, например

FROM ubuntu
COPY foo.sh foo.sh
RUN chmod +x foo.sh # if it’s not executable already
ENTRYPOINT ["./foo.sh"]

. Это также позволяет избежатьпроблема с sh -c, потребляющим свой первый аргумент, отмеченный в ответе @ GlennJackman.

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