Использовать вывод консоли в Dockerfile - PullRequest
0 голосов
/ 28 февраля 2019

Я хочу использовать вывод консоли в качестве имени моего базового образа докера.

В частности, у меня есть цепочка зависимых файлов сборки Docker, поэтому я пытаюсь автоматизировать этот процесс.Так, например, Dockerfile одного изображения derived1 зависит от базового изображения base_image_name в следующем сценарии:

base_image_name/ 
    Dockerfile
    derived1/
        Dockerfile
    derived2/
        Dockerfile

Когда создается базовое изображение, оно берет свое имя из текущей папки с помощью${PWD##*/}.В этом случае папка базового изображения называется base_image_name, поэтому базовое изображение называется company:base_image_name.

Затем, когда создаются производные изображения, они должны просто иметь возможность определить имя базового изображения, перемещаясь вверх по каталогу и просматривая имя этих каталогов.Так, например, при сборке образа company:derived1 он должен искать один каталог, видеть, что он называется base_image_name, и из этого следует, что он должен использовать базовый образ company:base_image_name.

Мне бы хотелось, чтобы эта структура была глубиной в несколько слоев, поэтому я хочу автоматизировать ее.Чтобы сделать это, я попробовал несколько вариантов синтаксиса

FROM company:$(cd $PWD/../;  echo ${PWD##*/})

, но я не могу понять, что это правильно.Чтобы понять, что делает команда $(cd $PWD/../; echo ${PWD##*/}), просто введите ее в свой терминал.

echo $(cd $PWD/../;  echo ${PWD##*/})

просто возвращает имя каталога на один уровень выше.Однако, когда я пытаюсь использовать это в Dockerfile, я получаю сообщение об ошибке

Error response from daemon: Dockerfile parse error line 1: FROM requires either one or three arguments

Может ли кто-нибудь предоставить мне правильный синтаксис?

РЕДАКТИРОВАТЬ:

Iтакже попытался создать производные изображения с build-arg, но это тоже не сработало:

build.sh:

BASE=$(cd $PWD/../../; echo ${PWD##*/})
echo "BASE="$BASE
docker build --build-arg BASE=${BASE} -t company:"${PWD##*/}" . 

, где Dockerfile выглядит как

FROM company:$BASE

В частности, это приводит кошибка сборки:

BASE=base_image_name
Sending build context to Docker daemon   5.12kB
Step 1/3 : FROM company:$BASE
invalid reference format

Таким образом, похоже, что докер неправильно интерпретирует этот аргумент сборки.

Ответы [ 3 ]

0 голосов
/ 28 февраля 2019

Dockerfiles не поддерживают синтаксис оболочки в целом, за исключением некоторых очень ограниченных расширений переменных среды .

Они поддерживают ARG s, которые могут быть переданы из командной строкии и ARG могут использоваться для определения изображения FROM.Таким образом, вы можете запустить Dockerfile с

ARG tag
FROM company:${tag:-latest}

, а затем создать образ с помощью

docker build --build-arg tag=$(cd $PWD/../;  echo ${PWD##*/}) .

(что достаточно для того, чтобы вы могли записать его в скрипт оболочки).

На очень низком уровне также стоит помнить, что docker build работает, создавая tar-файл из текущего каталога, отправляя его по HTTP-соединению демону Docker и выполняя там сборку.После того, как этот процесс произошел, любое понятие имени каталога хоста теряется.Другими словами, даже если синтаксис сработал, docker build также не имеет возможности узнать, в каком каталоге хоста находится Dockerfile.

0 голосов
/ 28 февраля 2019

Aha.Нашел это.

Как отмечает Джонатон, кажется, что вы не можете легко перенести что-то из вашей среды в систему сборки.Кажется, вы должны использовать Docker build-arg s.

Решением было оценить переменную в терминале и передать ее как build-arg:

build.sh:

BASE=$(cd $PWD/../; echo ${PWD##*/})
echo "BASE="$BASE
docker build --build-arg BASE=${BASE} -t company:"${PWD##*/}" . 

Затем в Dockerfile производного изображения:

ARG BASE
FROM company:$BASE
0 голосов
/ 28 февраля 2019

Вы пытаетесь использовать bash подстановку команд в том, что не используется bash.

[Ссылка на Dockerfile [(https://docs.docker.com/engine/reference/builder/)) указывает, что переменная средыподстановка поддерживается инструкцией FROM.

Вместо этого вам нужно будет просто использовать переменную окружения в FROM, которую вы вычисляете вне Dockerfile и передаете в docker build.

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