我有一个构建过程,可以将typescript转换为javascript,缩小和连接css文件等。
我想将这些文件放入nginx docker容器中,但我不想要包含原始的javascript / css源代码,也不想使用我用来构建它们的工具。有没有一种好方法可以做到这一点,或者我是否必须在docker之外运行构建(或在单独定义的容器中),然后复制相关文件?
This page谈到以手动方式做类似的事情,但没有解释如何自动化该过程,例如与docker-compose或其他东西。
答案 0 :(得分:3)
/opt/webapp
。 在步骤1中使用构建映像启动构建docker容器
docker run -d -P --name BuildContainer -v /opt/webapp:/opt/webapp build_image_name
启动nginx
docker容器,该容器将使用构建代码所在的构建docker的共享卷。
docker run -d -P --name Appserver -v /opt/webapp:/usr/local/nginx/html nginx_image_name
构建并将构建代码发送到Appserver后。您可以删除BuildContainer
,因为不再需要。
以上步骤的优势:
Appserver
docker失败或停止,那么您的构建代码在主机中是安全的,您可以使用该构建代码启动新的docker。 编辑:
您可以将:ro
(只读)附加到一个容器不会影响另一个容器的卷。您可以阅读有关docker volume Here的更多信息。感谢@BMitch的建议。
答案 1 :(得分:2)
最新版本的docker支持多阶段构建,可以将构建产品从容器复制到另一个容器。
https://docs.docker.com/engine/userguide/eng-image/multistage-build/
答案 2 :(得分:1)
两个常见选项:
如上所述,您可以在外部构建并将编译结果复制到容器中。
您将下载,构建和清理步骤合并到一个RUN
命令中。这是最小化每个图层大小的常见最佳做法。
第二个选项的示例Dockerfile如下所示:
FROM mybase:latest
RUN apt-get update && apt-get install tools \
&& git clone https://github.com/myproj \
&& cd myproj \
&& make \
&& make install
&& cd .. \
&& apt-get rm tools && apt-get clean \
&& rm -rf myproj
线条会比这复杂一点,但这就是要点。
答案 3 :(得分:0)
正如@dnephin在他对这个问题的评论和@ pl_rock的回答中所建议的那样,标准的docker工具不是为了这个而设计的,但你可以使用第三方工具,如下所示:
(当我写答案时,GitHub明星正确)
我们选择了dobi,因为它是我们听到的第一个(因为这个问题),但它看起来像打包机是最受欢迎的。
答案 4 :(得分:-1)
创建一个docker文件来运行构建过程,然后运行清理代码
示例:
FROM node:latest
# Provides cached layer for node_modules
ADD package.json /tmp/package.json
RUN cd /tmp && npm install
RUN mkdir -p /dist && cp -a /tmp/node_modules /dist/
RUN cp /tmp/package.json /dist
ADD . /tmp
RUN cd /tmp && npm run build
RUN mkdir -p /dist && cp -a /tmp/. /dist
#run some clean up code here
RUN npm run cleanup
# Define working directory
WORKDIR /dist
# Expose port
EXPOSE 4000
# Run app
CMD ["npm", "run", "start"]
在您的泊坞窗撰写文件
中web:
build: ../project_path
environment:
- NODE_ENV=production
restart: always
ports:
- "4000"