功能:將編譯的基礎環境,編譯構建通過dockerfile一步完成(目的是將git下載的代碼編譯並將生成的目錄同步到宿主機)
思路:git上不同的分支和包名定義成變量,將一個shell放入dockerfile中,shell中的變量通過env定義的環境變量來賦值,而定義的環境變量的值dockerfile中為空,通過docker run運行時來賦值;可能很多人會問這樣不是復雜化了,本人剛開始動手時也並沒有這樣而是直接通過arg賦值的方式加RUN 執行下載編譯過程的,而這種方式首先上面的目的中目錄同步只能通過Volume實現它的缺點是只能同步到/var/lib/volume下並隨機生成一長串名字的目錄不方便后期取包操作,第二是這種方式需要每次都build構建鏡像然后run.而下面介紹的這種方式是只構建一次鏡像每次打包只需run 后面加上變量就可以了,反而簡單化了
dockerfile
#如果對基礎鏡像和依賴包版本沒有要求,可使用dockhub上官方發布集成的基礎環境
FROM node:8.9.4-alpine
#FROM node:12.16.1-alpine
RUN apk add --no-cache -U make git python g++
RUN yarn config set registry https://registry.npm.taobao.org
WORKDIR /pack
WORKDIR /build
COPY build.sh .
RUN chmod +x /build/build.sh
ENV branch=
ENV packname=
RUN node -v && yarn -v && npm -v
ENTRYPOINT ["sh","./build.sh"]
第一步:FROM 引用基礎基礎鏡像,並安裝編譯環境使用的包(這個需要git\node\yarn)並配置環境變量
第二步:將本地build.sh上傳到鏡像中代碼如下:
#!/bin/bash
git clone -b $branch https://賬號:密碼@gogs.xiao*******.com/h5app/"$packname".git
echo $?
cd $packname
echo $?
yarn install
echo $?
npm run prod
echo $?
ls -l /
pwd
cp -r dist /pack
cd /pack/dist
sed -i 's;<script src="assets/lib/mock.js"></script>;;g' index.html
sed -i 's;<script src="main.js"></script>;;g' index.html
..............
echo $?
第三步:docker build -t packdocker .
第四步:docker run -v 宿主機目錄:容器目錄 -e "branch=分支名" -e "packname=包名" 鏡像id
--------------------------------------------------------------------------------------------------------------------
Dockerfile中使用的命令詳情
FROM <image>
必須引用一個基礎鏡像,首先本地查找沒有到話自動官方下載,也可以是阿里雲自己上傳鏡像復制阿里雲鏡像地址就可以
重點:賊好用的from多階構建(docker17.05以后版本)
示例:
FROM centos7 as build #as給鏡像起個名 WORFDIR /build RUN touch a #在build目錄下創建個文件 FROM centos7 #沒有看錯繼續在創建了鏡像 COPY --from=build /build/a /home # from引用上個鏡像並把上個鏡像中的文件拷到當前鏡像 ....
這個image最終會以第二個from的鏡像為基礎,注意:2個鏡像系統可以不同,也可以是單純的文件系統,可以多層
如果第一個鏡像不用as 第二個可以用--from=0 默認就是第一個鏡像,以此類推。
更多復雜應用慢慢研究。。。。
WORKDIR
進入目錄,沒有自動創建,另一篇docker基礎中可以查看
COPY和ADD <本地><鏡像>
相同點:把本地文件拷貝到鏡像,本地文件必須是上下級目錄中,只拷貝目錄中文件不包含目錄自身
不同:copy可以用在上面說的多階構建中,add不可以;add可以自動解壓壓縮文件;add可以從url拷貝文件這個目前沒用到過
ENV <key><value>
設置環境變量,可以是系統有的如:PATH= 可以自己創建 ABC=
workdir、volume、run、entryoint...中都可以使用,可以定義個空值,在docker run -e “ABC=” 來賦予一個變量
具體示例可以參考 https://www.cnblogs.com/Json1208/p/8974978.html 轉載自<飄來盪去>作者
ARG
arg可以說也是設置環境變量,和env不同的是arg設置的是構建環境的環境變量,在 docker build --build-arg “ 參數名=值”
只在構建中生效,在生成的image中無效,可以當做參數-賦值來使用
FROM centos7 ARG dir WORKDIR /$dir ....... docker build --build-arg "dir=home"
CMD
exec和shell兩種模式
CMD 【“curl”,“-s”,“http://ip.cn” 】
CMD command param1 param2
指定啟動程序,只能一條,如果多條以最后一條為准,前面的被覆蓋
可以在docker run -t centos 后面跟curl -s http://ip.cn -i 加了一個-i的參數 必須cmd內容重新輸一遍后面再加-i
FROM ubuntu:16.04
RUN apt-get update \ && apt-get install -y curl \ && rm -rf /var/lib/apt/lists/*
CMD [ "curl", "-s", "http://ip.cn" ]
$ docker run myip
當前 IP:61.148.226.66 來自:北京市 聯通
可以結合entrypoint命令來使用
ENTRYPOINT
指定容器的啟動程序和參數
只能一條,多條以最后一條為准,可以不被docker run 提供的參數覆蓋
docker run -t centos /bin/bash
FROM centos7 ENTRYPOINT ["/bin/echo", "hell0"]
docker run -it centos7 word #entrypoint會把word當成一個echo的字符串參數,不會進入到容器中
#輸出
hello word
docker run -it centos --entrypoint
=this is word 后面加參數可替代dockerfile中定義的
輸出
this is word
例子二
FROM centos7
ENTRYPOINT ["sh","build.sh"]
CMD ["packname"]
指定一個參數packname 給 build.sh
補充:
ls: can't open '/pack': Permission denied cp: can't create directory '/pack/dist': Permission denied ls: can't open '/pack': Permission denied 掛載目錄后 容器內復制目錄出現權限問題錯誤 給容器加特權: --privileged=true docker run -v /ceshi:/pack --privileged=true -e "branch=master" -e "packname=staff-seed" ceshi2.0
通過shell調用
通過dockerfile生成鏡像,每次操作都需要docker run ..... 執行帶來重復工作
思路:通過打包界面的接口調用shell打包,首先外部接口調用存放下面第一個腳本的服務器192.168.175.30傳送兩個參數分別是包名和分支,接着30將參數傳送到10上執行第二個腳本,最后將生成的包放到共享服務器20上
#!/bin/bash echo $1 echo $2 ssh root@192.168.175.10 "/bin/sh /root/h5appdocker.sh $1 $2" #ssh root@192.168.175.10 "[ -d /root/h5app/$1/dist ]" >/dev/null 2>&1 if [ $? -ne 0 ]; then echo "打包失敗" else echo "打包成功" rm -r /root/go/src/ant-builder/build/k8s/h5appdocker/$1 #rm -r $1 scp -r root@192.168.175.10:/root/h5appdocker/$1 /root/go/src/ant-builder/build/k8s/h5appdocker ssh root@192.168.175.20 "rm -r /staticdocker/$1" scp -r /root/go/src/ant-builder/build/k8s/h5appdocker/$1 root@192.168.175.20:/staticdocker/$1 fi
#!/bin/bash docker run -v /root/h5appdocker:/pack --privileged=true -e "branch=$2" -e "packname=$1" packdocker-node:8.9 mv /root/h5appdocker/dist /root/h5appdocker/$1 cd /root/h5appdocker/$1 #添加的參數 sed -i 's;<script src="assets/lib/mock.js"></script>;;g' index.html sed -i 's;<script src="main.js"></script>;;g' index.html ......... echo $?