Попытка смонтировать хост-том в контейнере Docker в Windows. Относительно чего находится исходная папка?

#docker #dockerfile #docker-volume #docker-run

#docker #dockerfile #docker-volume #docker-выполнить

Вопрос:

У меня возникли проблемы при попытке смонтировать том в моем контейнере docker.

Вот структура моего проекта

 cloudRun
  distService/
    index.js
  Dockerfile
  package.json    // THIS IS THE package.json FOR THE DOCKER IMAGE

package.json      // THIS IS MY MAIN PROJECT package.json
 

В моем основном проекте package.json у меня есть следующие сценарии:

 "docker-run": "./scripts/docker/docker-run.sh",
"docker-inspect": "docker exec -ti hello-world sh"   // THIS IS USED TO INSPECT THE RUNNING CONTAINER
 

docker-run.sh

 // STOPS ALL CONTAINERS
// REMOVES ALL CONTAINERS
// REMOVES ALL IMAGES

// BUILDS A NEW IMAGE FROM SCRATCH
docker build --tag hello-world:latest ./cloudRun

// TRYING TO RUN THE CONTAINER WITH A MOUNTED /distService VOLUME
docker run --name hello-world -p 3000:3000 -v //distService:/distService hello-world:latest
 

Это Dockerfile :

 FROM node:12-slim

WORKDIR /

COPY ./package.json ./package.json

RUN npm install

ENTRYPOINT npm start
 

Все работает. За исключением того факта, что контейнер отображается /distService как пустая папка.

Я знаю это, потому что, когда я открываю новое окно терминала и запускаю:

 npm run docker-inspect
 

Я могу вводить папки и ls их. И вот что я получаю: distService папка есть, но ls команда возвращается пустой. PS: Я ls включил node_modules только для того, чтобы показать, что он работает, и distService он действительно пуст.

введите описание изображения здесь

ВОПРОС

Когда я прохожу -v //folder:/folder , относительно какой исходной папки? Как я могу быть уверен, что я выбираю правильную папку?

Окружающая среда:

 Windows 10.
Docker for Windows installed
Docker Engine v19.03.13
 

Обновить

Я запустил контейнер и проверил его с помощью: docker inspect <CONTAINER_ID> чтобы узнать, какая папка монтируется. Но это не очень помогло. Вот что вернулось:

 "HostConfig": {
  "Binds": [
    "//distService/:/distService/"
],

// OTHER STUFF

"Mounts": [
  {
    "Type": "bind",
    "Source": "/distService",         // WHAT IS THIS PATH RELATIVE TO ?
    "Destination": "/distService",
    "Mode": "",
    "RW": true,
    "Propagation": "rprivate"
  }
],
 

Ответ №1:

Пути к docker run локальным папкам всегда указаны относительно корня. Чтобы получить относительный путь, используйте переменную PWD среды:

docker run -v $(PWD)/folder:/folder ...

Или docker-compose поддерживает относительные пути, если они начинаются с точки:

 version: '3.8'

services:
  nginx:
    image: nginx
    volumes:
    - ./folder:/www

 

Комментарии:

1. docker run -v $(PWD)/folder:/folder ... не работает. По крайней мере, не в Windows. Еще не тестировал docker-compose .

2. ах. прошло некоторое время с тех пор, как я использовал Windows. Не могу вспомнить переменную env, которая содержит в ней текущий каталог — вероятно, он будет другим и может содержать пробелы, поэтому важно обернуть все в «»s .

3. В Windows требуется двойная косая черта в начале пути для указания рабочего каталога. Просто для работы используйте вот так docker run -v //$(PWD)/folder:/folder ... . У меня работает с Git Bash

Ответ №2:

Это то, что я должен был сделать, чтобы заставить его работать.

В основном мне приходилось указывать полный абсолютный путь, начиная с c:/ .

 -v c:/Users/my-user/my-project/distService:/distService
 

Полная команда:

 docker run --name hello-world -p 3000:3000 -v c:/Users/USER/my-project/distService:/distService hello-world:latest
 

У меня возникла идея после того, как я нашел это в официальных документах:

введите описание изображения здесь

Комментарии:

1. В Windows требуется двойная косая черта в начале пути для указания рабочего каталога. Просто для работы используйте вот так docker run -v //$(PWD)/folder:/folder ...