Я работаю на примере 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:
$ pwd
/Users/zackmorris/Desktop/hello-system
Я знаю, что что-то критически важное, какотображение тома должно работать.
ОБНОВЛЕНИЕ : я открыл для этого проблему , и похоже, что это невозможно (это может быть ошибка / функцияиз ранней истории докера). лучший ответ на данный момент заключается в том, что Dockerfile вызывает RUN npm install
до того, как "$(pwd)"
монтируется в /usr/src/app
(который заменяет содержимое), поэтому каталог /usr/src/app/node_modules
заменяется ничем, что вызывает Node.js сбой, потому что он не может найти модуль express
, что приводит к закрытию контейнера.
Поэтому я ищу ответ, который обходит эту проблему и делает возможным отображение каталогов в общем смысле, без каких-либо странных ошибок, таких как необходимость переставить содержимое изображения.