当工作目录更改时,如何让 docker 运行命令?

时间:2021-06-26 15:36:27

标签: java docker workflow nodemon

来自 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 文件都会再次编译,我将能够看到差异。

1 个答案:

答案 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, ...)
相关问题