#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 ...