關於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