来自 docker bind mount 文档:
docker run -dp 3000:3000 `
-w /app -v "$(pwd):/app" `
node:12-alpine `
sh -c "yarn install && yarn run dev"
<块引用>
sh -c "yarn install && yarn run dev" - 命令。我们是 [...],如果我们查看 package.json,我们会看到 dev 脚本正在启动 nodemon
这对于 node.js 项目来说看起来不可思议,但是我如何为我的 Java 项目完成同样的事情?以某种方式,每次我更改工作目录中的某些内容时,java 文件都会再次编译,我将能够看到差异。
答案 0 :(得分:1)
在这里启用实时重新加载的神奇部分不是 Docker,而是一个名为 nodemon 的 Node 工具。其他语言也有类似的工具;例如,实时重新加载器包含在 Spring Boot developer tools 中。
Docker 没有任何内在的东西可以使实时重新加载成为可能。实际上,这与 Docker 的设计背道而驰:Docker 容器通常运行在不可变映像之上,当您更改代码时必须重新构建该映像。这意味着您需要额外的 Docker 选项来绕过 Docker 的正常文件系统隔离。
# Option A: use local node
sudo apt-get install nodejs
yarn install
yarn dev
# Option B: use Docker
sudo apt-get install docker.io # need to install something anyways
sudo \ # easy to use Docker to root the host
docker run \
--rm \ # don't leak the container
-v "$PWD:/app" \ # make local directory visible in application
-w /app \ # specify working directory
-p 3000:3000 \ # make the application port visible
node \ # image to run
sh -c \ # need an explicit shell for multiple commands
"yarn install && yarn run dev" # the thing we were actually trying to do
Docker 真正有用的地方是部署东西。如果您不需要绑定挂载或命令覆盖,那么您可以以一致的方式构建和部署任何应用程序(取决于每个应用程序 Dockerfile 中的详细信息):
# Deploy using Docker
# (not a live-development setup; fully compatible with option A above)
sudo docker build -t me/myapp:20210626 .
sudo docker run -d -p 3000:3000 me/myapp:20212026
# (works identically with Express, React, Flask, Spring Boot, ...)