Я пытаюсь запустить образ докера, который выполняет сценарий 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. Почему вторая точка входа работает иначе, чем первая?