关于docker构建前端环境,相关的坑点与难点,基本上都在这儿了,不少都是我的尝试总结的经验,都是从小白过来的,但愿能帮助你们快速解决一些问题,抛开前端环境来看,差很少点的镜像基本也够用了。反而前端对易用性的要求更高(前端开发人员可不是每天跟linux打交道),还须要考虑类unix系统与windows的差别化问题,这点会在下一篇文章中重点说明。html
打赏啥的也不须要,若是能够,很感激能在github上给个小星星,github入口在 博客最顶部前端
以前也说过 docker对于前端而言组重要的两个优点:node
如下主要分享一下过程中出现的比较坑或比较重要的点,在此不作傻瓜式的教程,也但愿你们可以多动手操做,遇到问题尝试自我解决并开源分享。linux
首先获取镜像有这么如下三种方式:webpack
在linux镜像中若出现not found或者命令未找到的报错信息,多半是由于环境变量未找到,未在相应文件中(~/bashrc
, ~/.zshrc
, ~/.profile
, ~/.bash_profile
)导出环境变量, 根据不一样的基础镜像与shell类型,与环境变量相关的文件也不尽相同: 例如ubuntu的文件为 ~/.bash_profile
。git
/bin/bash -c "source ~/.bash_profile"
docker build -t <image>:<tag> --network=host .
/etc/apk/repositories
:echo "http://mirrors.aliyun.com/alpine/latest-stable/main/" > /etc/apk/repositories \ && echo "http://mirrors.aliyun.com/alpine/latest-stable/community/" >> /etc/apk/repositories \使用ubuntu则须要修改
/etc/apt/sources.list
docker build -t <image>:<tag> --network=host --no-cache.
NodeJS | Minimum node-sass version | Node Module |
---|---|---|
Node 14 | 4.14+ | 83 |
Node 13 | 4.13+ | 79 |
Node 12 | 4.12+ | 72 |
Node 11 | 4.10+ | 67 |
Node 10 | 4.9+ | 64 |
Node 8 | 4.5.3+ | 57 |
/home/files/src
与 容器 /home/src
相挂载, 是以宿主机目录 /home/files/src/
为基准,若起初宿主机目录为空,容器对应目录存在文件,则挂载后,容器内文件会被清空。在此有个小技巧: 大部分状况下源码都在版本控制器中,以git为例,容器内文件被清空后,能够经过 git status
查看,是存在操做记录的,因此清空操做与git并不冲突, 使用正则作部分匹配还原便可:git checkout -- src/**
0.0.0.0
devServer: { ... host: '0.0.0.0', port: '9999', }
docker run -it -p 9999:9999 <image>:<tag>
当时想达到的效果就是经过容器执行dev操做,开启webpack-dev-server作端口映射,宿主机浏览器直接访问相应网址, 因为挂载卷中的文件与容器相连,修改后可根据热更直接显示在宿主机浏览器上,这样就大功告成了。
但实际操做过程是这样的:github
docker run -it -v /Users/tate/Documents/work/geek/docker/ws/src:/home/webpack-multipage-cli/src -p 9999:9999 ws:1 /bin/bash
npm run dev
启动开发模式0.0.0.0
// 此处的publicPath的端口号要与devServer中相同 module.exports = { output: { publicPath: `//localhost:9999/`, hotUpdateChunkFilename: 'js/hot-update-[name].js', hotUpdateMainFilename: `hot-update.json` } } * 在宿主机经过localhost或宿主机IP访问,避免经过0.0.0.0访问
COPY init.sh /home/
CMD ["/bin/bash", "-c", "/home/init.sh"]
# !/bin/bash source ~/.bash_profile cd /home/webpack-multipage-cli git checkout -- src/** page/** echo "WEBPACK_MODE: $WEBPACK_MODE" if [ $WEBPACK_MODE = 'dev' ]; then echo "running in develop mode" npm run dev else echo "running in build mode" npm run build fi
FROM pomelott/webpack-cli WORKDIR /home/webpack-multipage-cli COPY init.sh /home/ COPY cli-config.js /home/webpack-multipage-cli/ COPY output.js /home/webpack-multipage-cli/config/dev/ RUN chmod -R +x /home/init.sh EXPOSE 9999 CMD ["/bin/bash", "-c", "/home/init.sh"]
npm run dev
,因此不须要手动指定/bin/bashdocker run -it -p 9999:9999 -v /Users/tate/Documents/work/geek/docker/ws/src:/home/webpack-multipage-cli/src --env WEBPACK_MODE=dev pomelott/webpack-cli:latest
docker run -it -v -v /Users/tate/Documents/work/geek/docker/ws/src:/home/webpack-multipage-cli/src \ -v /Users/tate/Documents/work/geek/docker/ws/dist:/home/webpack-multipage-cli/dist --env WEBPACK_MODE=build pomelott/webpack-cli:latest