Отображение тома Docker не работает - PullRequest
0 голосов
/ 11 июня 2018

Я работаю на примере Dockerizing для веб-приложения Node.js , пытаясь понять Docker из первых принципов.Я загрузил его в repl.it с server.js, переименованным в index.js (из-за ошибки / функции, где repl.it форсирует существование index.js), вот ссылки:

Проект: https://repl.it/repls/BurlyAncientTrust

Демонстрационная версия: https://BurlyAncientTrust - five-nine.repl.co

Загрузить: https://repl.it/repls/BurlyAncientTrust.zip

Я также собрал некоторые основные операции, которые производят контейнер (ы) из изображений функциональным / декларативным способом, а не с использованием имен (удивительно, что для них нет центрального источника):

# commands to start, list, login and remove containers/images associated with current directory's image
# build and run docker image (if it was removed with "docker rmi -f <image>" then this restores IMAGE in "docker ps")
(image=<image_name> && docker build -t $image . && docker run --rm -p <host_port>:<container_port> -d $image)
# list container id for image name
(image=<image_name> && docker ps -a -q --filter=ancestor=$image)
(image=<image_name> && docker ps -a | awk '{print $1,$2}' | grep -w $image | awk '{print $1}')
# run/exec bash inside container (similar to "vagrant ssh")
(image=<image_name> && docker exec -it $(docker ps -a -q -n=1 --filter=ancestor=$image) bash)
# remove containers for image name
(image=<image_name> && docker ps -a -q --filter=ancestor=$image | xargs docker rm -f)
# remove containers and specified image
(image=<image_name> && docker ps -a -q --filter=ancestor=$image | xargs docker rm -f && docker rmi $image)

Чтобы создать и запустить пример:

Загрузите и распакуйте BurlyAncientTrust.zip

cd <path_to>/BurlyAncientTrust

Затем:

(image=node-web-app && docker build -t $image . && docker run --rm -p 49160:8080 -d $image)

Посетите:

http://localhost:49160/

Вы должны увидеть:

Hello world

Проблема в том, что я не могу получить опцию -v для сопоставления томов (синхронизация каталогов):

(image=node-web-app && docker ps -a -q --filter=ancestor=$image | xargs docker rm -f && docker rmi $image)
(image=node-web-app && docker build -t $image . && docker run --rm -v "$(pwd)":/usr/src/app -p 49160:8080 -d $image)

Я вижу:

This site can’t be reached

И docker ps больше не показывает контейнер.Я использую Mac OS X High Sierra, поэтому часть "$(pwd)" может отличаться на других платформах.Вы можете просто заменить его абсолютным путем к текущему рабочему каталогу.Вот полный вывод:

Zacks-Macbook:hello-system zackmorris$ (image=node-web-app && docker ps -a -q --filter=ancestor=$image | xargs docker rm -f && docker rmi $image)
Untagged: node-web-app:latest
Deleted: sha256:117288d6b7424798766b288518e741725f8a6cba657d51cd5f3157ff5cc9b784
Deleted: sha256:e2fb2f92c1fd4697c1d217957dc048583a14ebc4ebfc73ef36e54cddc0eefe06
Deleted: sha256:d274f86b6093a8e44afe1720040403e3fb5793f5fe6b9f0cf2c12c42ae6476aa
Deleted: sha256:9116e43368aba02f06eb1751e6912e4063326ce93ca1724fead8a8c1e1c6c56b
Deleted: sha256:902d4d1718530f6c7a50dd11331ee9ea85a04464557d699377115625da571b61
Deleted: sha256:261c92dc9ba95e2447e0250ea435717c855c6b184184fa050fc15fc78b1447f8
Deleted: sha256:559b16060e30ea3875772aae28a2c47508dfebda35529e87e7ff46f035669798
Deleted: sha256:4316607ec7e64e54ad59c3e46288a9fb03d9ec149b428a8f70862da3daeed4e5
Zacks-Macbook:hello-system zackmorris$ (image=node-web-app && docker build -t $image . && docker run --rm -v "$(pwd)":/usr/src/app -p 49160:8080 -d $image)
Sending build context to Docker daemon  57.34kB
Step 1/7 : FROM node:carbon
 ---> baf6417c4cac
Step 2/7 : WORKDIR /usr/src/app
 ---> Using cache
 ---> 00b2b9912592
Step 3/7 : COPY package*.json ./
 ---> f39ed074815e
Step 4/7 : RUN npm install
 ---> Running in b1d9bf79d502
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN docker_web_app@1.0.0 No repository field.
npm WARN docker_web_app@1.0.0 No license field.

added 50 packages in 4.449s
Removing intermediate container b1d9bf79d502
 ---> cf2a5fce981c
Step 5/7 : COPY . .
 ---> 46d46102772b
Step 6/7 : EXPOSE 8080
 ---> Running in cd92fbacacf1
Removing intermediate container cd92fbacacf1
 ---> ac13f4eda9a2
Step 7/7 : CMD [ "npm", "start" ]
 ---> Running in b6cd6811b0ce
Removing intermediate container b6cd6811b0ce
 ---> 06f887984da8
Successfully built 06f887984da8
Successfully tagged node-web-app:latest
effc653267558c80fbcf017d4c10db3e46a7c944997c7e5a5fe5d8682c5c9dad

Общий доступ к файлам Docker:

enter image description here

$ pwd
/Users/zackmorris/Desktop/hello-system

Я знаю, что что-то критически важное, какотображение тома должно работать.

ОБНОВЛЕНИЕ : я открыл для этого проблему , и похоже, что это невозможно (это может быть ошибка / функцияиз ранней истории докера). лучший ответ на данный момент заключается в том, что Dockerfile вызывает RUN npm install до того, как "$(pwd)" монтируется в /usr/src/app (который заменяет содержимое), поэтому каталог /usr/src/app/node_modules заменяется ничем, что вызывает Node.js сбой, потому что он не может найти модуль express, что приводит к закрытию контейнера.

Поэтому я ищу ответ, который обходит эту проблему и делает возможным отображение каталогов в общем смысле, без каких-либо странных ошибок, таких как необходимость переставить содержимое изображения.

1 Ответ

0 голосов
/ 12 июня 2018

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

https://blog.codeship.com/using-docker-compose-for-nodejs-development/

Он смог заставить его работать с помощью сопоставления node_modules как дополнительный том в его docker-compose.yml (обратите внимание, что мой путь - /usr/src/app, а его - /usr/app/, поэтому не копируйте его пастой):

volumes:
  - .:/usr/app/
  - /usr/app/node_modules

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

Я пробовал это как необработанную команду Docker -v /usr/src/app/node_modules, и это сработало!Вот новый автономный пример, идентичный BurlyAncientTrust, но с добавленным каталогом node_modules:

Проект: https://repl.it/repls/RoundedImpishStructures

Демонстрационная версия: https://RoundedImpishStructures - пять-девять.repl.co

Загрузить: https://repl.it/repls/RoundedImpishStructures.zip

Чтобы создать и запустить пример:

Загрузите и разархивируйте RoundedImpishStructures.zip затем:

cd <path_to>/RoundedImpishStructures

Удалите старый контейнер и изображение, если вы их использовали:

(image=node-web-app && docker ps -a -q --filter=ancestor=$image | xargs docker rm -f && docker rmi $image)

Запустите новый пример:

(image=node-web-app && docker build -t $image . && docker run --rm -v "$(pwd)":/usr/src/app -v /usr/src/app/node_modules -p 49160:8080 -d $image)

Вы должны увидеть:

Hello world

Пожалуйста, не голосуйте за этот ответ, так как я не считаю его общим решением.Надеюсь, это кому-то поможет.

...