Как передать путь к файлу в файл докера - PullRequest
0 голосов
/ 25 апреля 2019

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

Я хочу, чтобы это было несколько гибким, чтобы, если пользователь не указал путь к каталогу, он будет использовать значение по умолчанию. Из того, что я исследовал, мне нужно использовать ARG и, возможно, -e флаг во время выполнения. Давайте рассмотрим пример с этим простым Dockerfile.

FROM ubuntu:latest
#Assign the default value
ARG DIRHOME=/opt/docker/q
#if -e has not been set the use default DIRHOME
ADD $DIRHOME /q

Dockerfile находится в папке / opt / docker, куда я буду запускать

docker build --build-arg DIRHOME=/q .

Это все работает успешно, но, как вы можете видеть, я всегда использую значение по умолчанию. Есть ли у пользователя способ передать свой путь к исполняемому файлу q во время выполнения, чтобы перезаписать переменную DIRHOME? Что-то вроде ниже

docker run -e "QHOME=/user1/lib/q" <container id>

Я думаю, что проблема заключается в том, что это связано с контекстом сборки, поэтому, если я запускаю свой Dockerfile внутри / opt / docker, он воспринимает это как свой корень и не может найти путь / user1 / lib / q. Есть потенциальные обходные пути?

Ответы [ 2 ]

1 голос
/ 25 апреля 2019

В целом, полезный шаблон здесь - это использовать фиксированный путь внутри контейнера Docker и позволить администратору монтировать все, что нужно там, используя опцию docker run -v.Абсолютно нет требования, чтобы пути хоста и контейнера совпадали.Путь может быть фиксированным свойством в Dockerfile, его не нужно настраивать с помощью ARG.

Если бы это был какой-то сканер безопасности, скажем, администратор мог бы запустить

sudo docker run \
  -v $GOPATH/bin:/scan \
  myscanner \
  myprogram

Сканер будет смотреть на /scan/myprogram;но на хосте это будет $GOPATH/bin/myprogram.

Если основной целью вашей программы является работа с файлами на хосте, учтите, что Docker в качестве цели проектирования заставляет работать с файлами хостасложно;В дополнение к этому вопросу о сопоставлении томов существуют повторяющиеся проблемы с правами доступа к файловой системе и другие проблемы, которые возникают, если вы хотите запустить это задание из Docker.Рассмотрите возможность использования более простого механизма упаковки (распространение статически связанного двоичного файла, виртуальной среды Python, пакета RPM или dpkg, ...).Как пользователь, я бы предпочел запустить

myscanner $(which myprogram)
1 голос
/ 25 апреля 2019

Когда вы запускаете сборку Docker, вы копируете файлы из DIRHOME в образе Docker.таким образом, DIRHOME после сборки не имеет смысла.было бы более разумно установить путь внутри контейнера в качестве переменной среды:

ENV qpath /q
ADD /opt/docker/q $qpath

А затем после этого при попытке запустить образ с помощью docker run стандартным способом передачи данных с хост-машины.в контейнер с помощью томов.тогда вы можете использовать переменную окружения:

docker run -v /user1/lib/q:/q image
...