如何解决如何使用docker映像生成可从nginx映像提供服务的静态文件?
我要么错过了一些非常明显的东西,要么我完全错误地采用了这种方式,我可以使用一些新的见解。
我有以下使用docker-compose链接在一起的docker镜像(简体):
- 前端(一个Vue.js应用)
- 后端(Django应用)
- nginx
- postgres
在开发中,我不使用nginx,而是使用yarn serve
将Vue.js应用作为观察者运行,而Django使用manage.py runserver
。
我想为生产做什么(用CI / CD):
- 构建并推送后端图片
- 构建并推送nginx图像
- 使用
yarn build
命令构建前端图像 - 通过卷将生成的文件保存在nginx容器中?
- 部署新图像
问题是:如果将yarn build
作为CMD
放入Dockerfile中,则在容器启动时进行编译,而我希望在容器中完成编译。 CI / CD中的构建步骤。
但是,如果我在图像中放置了RUN yarn build
,我该如何放置CMD
呢?以及如何将生成的静态文件保存到nginx?
我可以找到的解决方案是使用多阶段构建的前端,最后一步是将nginx图像结合在一起。但是我需要nginx图像独立于前端图像,所以这对我不起作用。
我觉得这个问题已经被很多人解决了,但我找不到一个例子。建议非常感谢!
解决方法
在docker-compose.yml文件中创建一个卷,并将相同的卷安装到您的前端容器(到构建文件所在的路径,如dist
文件夹)和nginx容器(到您的Web根目录)中路径)。这样,两个容器都可以访问相同的卷。
此外,将yarn build
保留为RUN命令。
编辑:
容器需要运行程序或命令才能被分类为容器,因此可以启动,停止等。这是设计使然。
如果您不打算使用命令从前端容器提供服务,则应该从docker-compose.yml中将其作为服务(因为不是)从服务中删除,并将其作为构建阶段添加到您的nginx dockerfile中,或者您可以使用某种将在您的前端容器中无限期运行的命令,例如tail -f index.html
。第一个解决方案是更好的做法。
在您的nginx dockerfile中,添加前端构建dockerfile作为第一个构建阶段:
From: node as frontend-build
WORKDIR /app
RUN yarn build
From:nginx
COPY --from=frontend-build /app/dist /usr/shared/nginx/html
...
CMD ["nginx"]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。