Dockerfile應用之----自動化打包


功能:將編譯的基礎環境,編譯構建通過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 $?

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM