Я пишу программу на 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] ошибка ожидания контейнера: контекст отменен