РЕДАКТИРОВАТЬ : Чтобы сделать этот ответ полным, я добавляю то, что уже упоминалось в комментарии к вопросу. Тот факт, что переключатель -v
в команде docker run
расположен неправильно.
Основная причина того, что ваше выполнение здесь не работает так, как ожидалось, заключается просто в том, что переключатель -v /some/path
добавляется в конец команды docker run
после имени изображения.
docker run --help
дает следующее описание синтаксиса ввода:
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Здесь указано, что [OPTIONS]
должно быть предоставлено перед названием изображения. Перед всеми переключателями опций стоит одинарный или двойной -
, и в большинстве случаев после него следует параметр переключателя. И поэтому двоичный файл docker
будет идентифицировать первый аргумент команды docker run
, то есть , а не , которому предшествует -
в качестве имени изображения.
Аргументы, следующие за именем изображения, будет интерпретироваться как переопределяющая команда ([COMMAND] [ARG...]
) и добавляться к ENTRYPOINT
, определенному в Dockerfile
, из которого было создано изображение.
Вы определили ENTRYPOINT
:
ENTRYPOINT ["java","-jar","demo.jar"]
И, учитывая, что вы предоставляете первый пример выполнения, это:
docker run please/work -v /root/hayasaka:/usr/app/
В результате команда, выполненная в контейнере, будет такой:
java -jar demo.jar -v /root/hayasaka:/usr/app/
Это конечно не ваше намерение. И если программа, вероятно, не ожидает никаких аргументов, она просто проигнорирует их.
Вот обзор вашего ввода и результатов.
Файл 1.txt
create(".", "1");
Это будет ./1.txt
, или в абсолютном выражении /usr/app/1.txt
, что является прекрасным и допустимым путем. Файл 1.txt
будет создан в рабочем каталоге процесса java, который, в свою очередь, является рабочим каталогом пользователя, запускающего программу java, которую вы установили в Dockerfile
как * 1053. *.
Файл 2.txt
create("", "2");
Это создаст файл /2.txt
, файл в root файловой системы в контейнере. учитывая, что сопоставлен том только каталог /usr/app
, этот файл не будет виден извне контейнера.
Файл 3.txt
create("app/usr", "3");
Это создаст файл app/usr/3.txt
, который является местоположением относительно рабочего каталога процесса java. Абсолютный путь - /usr/app/app/usr/3.txt
. Это не удается, скорее всего, из-за отсутствия промежуточной структуры каталогов app/usr
. Используйте этот подход для решения проблемы:
if (!myObj.getParentFile().exists()) {
myObj.getParentFile().mkdirs();
Это создаст недостающие промежуточные каталоги.
Файл 4.txt
create("/usr/app", "4");
Будет создан файл /usr/app/4.txt
, существующий абсолютный путь, поскольку сборка docker создаст его с заданным определением Dockerfile
. Здесь нет проблем.
Файл 5.txt
create("usr/app", "5")
Это пытается создать файл usr/app/5.txt
, который, как и файл 3.txt
, является местоположением относительно рабочего каталога java процесс. Абсолютный путь - /usr/app/usr/app/5.txt
. Он завершится неудачей по тем же причинам, что и 3.txt
.
Надеюсь, это дает хороший обзор!