Как создать файл, а не каталог автоматически при монтировании файла хоста из контейнера - PullRequest
0 голосов
/ 15 июня 2019

Я пишу cli, который по окончании создаст файл уценки, и создаю образ докера для этого cli.

Я хочу смонтировать файл уценки, сгенерированный контейнером, на хост-машину.

docker -v автоматически создаст папку, а не файл, если путь на хосте не существует.

Например.~ / result.md сначала не существует.

docker run -it --rm -v ~/result.md:/usr/src/work_dir/result.md cli:latest generate_markdown

После запуска папка ~/result.md создается, но не файл, и в результате возникает исключение из-за записи в каталог, а не в файл.

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

Ответы [ 3 ]

0 голосов
/ 15 июня 2019

Вы должны избегать монтирования файлов вместе в соответствии с лучшими практиками. При этом невозможно изменить описанное вами поведение ошибки x.

Решение вашей проблемы (не создавать файл каждый раз перед запуском контейнера) состоит в том, чтобы смонтировать каталоги, пропустив имена файлов.

docker run -it --rm -v ~/:/usr/src/work_dir/ cli:latest generate_markdown
0 голосов
/ 15 июня 2019

Попробуйте -

$docker volume create myvol

$docker run -it --rm -v myvol:/usr/src/work_dir/ cli:latest generate_markdown

В качестве альтернативы вы можете просто

$docker run -it --rm -v myvol:/usr/src/work_dir/ cli:latest generate_markdown

Хотите получить объяснение?

Вы используете крепление для привязки;в вашем случае

docker run -it --rm -v ~/result.md:/usr/src/work_dir/result.md cli:latest generate_markdown

Решением вашей проблемы может быть просто том для монтирования .За дополнительной информацией обращайтесь - https://docs.docker.com/storage/volumes/

Сначала создайте том докера by- $docker volume create myvol.Вы можете дать любое имя вместо myvol.

Этот том докера будет создан, вы можете проверить, успешно ли создан том by-

$docker volume ls Это даст список всех ваших томов,Ваш вновь созданный том должен быть в списке.

ak@ubuntu:~$ docker volume create myvol
myvol
ak@ubuntu:~$ docker volume ls
DRIVER              VOLUME NAME
local               myvol

Тома Docker хранятся в отдельной области в файловой системе хоста и полностью управляются докером, а не привязывают монтирование. Состояние хранения томов Docker снаружиконтейнеров, поэтому ваши данные сохраняются при замене контейнера для обновления приложения.

Тома Docker также создаются автоматически, если вы указываете имя вместо пути к каталогу.В следующем примере автоматически создается том с именем myvol2 -

$docker run -it -v myvol2:/home/myfiles imagename:tag

Тома Docker обычно создаются в /var/lib/docker/volumes в linux и в C:\ProgramData\docker\volumes в Windows.

Теперь вот полезная часть .Любые данные / файл / каталоги, которые уже существуют в указанном каталоге контейнера, автоматически копируются или «монтируются» на том докера.Поэтому, если каталог '' '/ usr / src / work_dir /' '', упомянутый в приведенном выше примере, содержит какие-либо файлы (например, файл разметки в вашем случае), они автоматически копируются на том.

Hopeэто помогает.

0 голосов
/ 15 июня 2019

При подключении тома будет использоваться имя каталога, а не файл.Вы можете смонтировать том ~ или создать каталог и смонтировать этот том.

mkdir ~/markdown
docker run -it --rm -v ~/markdown/:/usr/src/work_dir/ cli:latest generate_markdown
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...