我有一个项目,React作为前端,NodeJS作为后端,MongoDB作为持久性。我怎么能用实时重新加载和nginx编写一个用于开发的dockerfile只用于生产edieing只有docker-compose? thxx
答案 0 :(得分:0)
您应该通过将代码目录映射到应该重新加载的容器内的代码目录来利用volumes
功能。
你的问题很一般,所以我也会发布一般性的步骤,因为我不知道你的问题会坚持哪些服务。
一般来说,您有两件事需要解决:
<强> 1。向容器提供最新内容
在docker-compose文件中,在所需的服务定义中,您应该添加一个卷记录,将您的本地代码映射到内部容器代码,如下所示:
虚构的项目树:
root
- one-app
+ some.sh
+ Dockerfile
- second-app
+ some.rails
+ Dockerfile
- docker-compose.yml
假想撰写文件内容:
one-app:
build: one-app/
volumes:
- ./one-app:/usr/src/app
# further definitions
# another services
这会在每次更改时将代码放入容器中。
现在进行第二步
<强> 2。确保您的http服务器将在更改时重新加载
在开发环境中,使用标准nodejs
http服务器,您的应用会自动重新加载,此处无需配置。
只是为了对比 - 如果是基于gunicorn
的http服务器,则必须提供启动参数--reload
使用上述配置,您的应用会在代码更改时重新加载。
从评论中修改
对于开发环境
如果在开发环境中不需要nginx,那么可以通过npm run serve
运行您的应用程序,或者在没有nginx的情况下在本地运行它,代码映射就像我上面提到的那样 - 它将完美地运行。
所以它在你的撰写文件中就像下面那样
one-app:
build: one-app/
volumes:
- ./one-app:/usr/src/app
command: npm run serve # or whatever command you start a local server with
# further definitions
# another services
生产环境
或者如果在开发环境中也需要nginx:在一个容器中构建您的应用程序,在第二个容器中,您从nginx
提供构建的应用程序。基本的撰写设置如下:
app:
# frontend definitions
volumes:
- app-volume:/usr/src/app
command: "npm run build && cp dist/* /usr/src/app/"
nginx:
# nginx definitions
volumes:
- app-volume:/usr/share/nginx/html
上述方法将与nginx
共享构建的代码,nginx
将从映射到前端应用程序内/dist
的公共目录中提供。
这就是我们在公司的工作方式。