Чтение входных файлов с помощью докера - PullRequest
0 голосов
/ 12 мая 2018

Я пишу программу на C ++, которая запускается следующим образом:

./program data_file config_file

И я хочу использовать с ним докер. Я написал следующее Dockerfile:

FROM gcc:7.2.0
ENV MYP /repo
WORKDIR ${MYP}
COPY . ${MYP}

RUN /bin/sh -c 'make'
ENTRYPOINT ["./program"]
CMD ["file1", "file2"]

Так что я docker build -t test . это и использую docker run test и вижу, что все идет хорошо с настройками по умолчанию.

Однако, если я изменю, например, file1 в моем рабочем каталоге (после сборки), я отмечу, что когда я запускаю docker run test file1 file2, вызывается file1 тот, который внутри контейнера, а введенный в качестве аргумента игнорируется.

Аналогичным образом, если я использую переименованные файлы данных и конфигурации и запускаю docker run test file3 file4, я получаю сообщение об ошибке, в котором говорится, что эти файлы не существуют (поскольку их нет в контейнере).

Итак, как мне сделать так, чтобы docker распознал эти входные файлы, переданные в качестве аргументов, избегая использования файлов, содержащих в изображении?

Версия Docker 18.04.0-ce, сборка 3d479c0af6.

EDIT

Другой вариант - использовать скрипт launch.sh, например:

#!/bin/sh
./program "${DATA_FILE}" "${CONFIG_FILE}"

Итак, инструкции ENTRYPOINT и CMD заменены следующей строкой в ​​Dockerfile:

CMD ["./launch.sh"]

Но теперь, если я бегу:

docker run test -e DATA_FILE=file1 -e CONFIG_FILE=file2

Я получаю ошибку разрешения ...

docker: Ответ от демона об ошибке: Ошибка создания среды выполнения OCI: container_linux.go: 348: запуск процесса контейнера вызвал "exec: \" - e \ ": исполняемый файл не найден в $ PATH": неизвестно. ERRO [0000] ошибка ожидания контейнера: контекст отменен

1 Ответ

0 голосов
/ 12 мая 2018

Вы можете использовать механизм томов для монтирования каталога хоста в контейнер.

Создание файлов file1.txt и file2.txt в некотором каталоге на хост-компьютере.Например, мы создаем файлы в каталоге /var/dir1/.
Ваш рабочий каталог в контейнере докера /program.

Поэтому, когда вы запускаете Docker, вы должны смонтировать этот каталог хоста в контейнер, используя -v flag

docker run -v /var/dir1/:/program test file1.txt file2.txt

О, я знаю, почему у нас проблема,

Когда я монтирую каталог хоста в рабочий каталог, я фактически удаляю из него все созданные файлы внутри контейнера, включая двоичный файл ./program.Таким образом, команда docker run не выполнена.
поэтому мы не должны монтировать рабочий каталог.Например, мы можем смонтировать подкаталог рабочего каталога.

 docker run -v /var/dir1/:/program/dir test dir/file1.txt dir/file2.txt 

У меня это работает!

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