成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

docker與git實(shí)現(xiàn)push-to-deploy

ad6623 / 2716人閱讀

摘要:背景最近在研究基于的持續(xù)交付過(guò)程,可以構(gòu)建宿主機(jī)無(wú)關(guān)的軟件運(yùn)行環(huán)境,通過(guò)的機(jī)制在發(fā)生特定的事件時(shí)觸發(fā)目錄下特定的腳本,可以完成在代碼到遠(yuǎn)端的倉(cāng)庫(kù)的同時(shí),構(gòu)建運(yùn)行容器,達(dá)到的目的。項(xiàng)目介紹到此,下面開(kāi)始利用的事件機(jī)制實(shí)現(xiàn)。

背景

最近在研究基于docker的持續(xù)交付過(guò)程,docker可以構(gòu)建宿主機(jī)無(wú)關(guān)的軟件運(yùn)行環(huán)境,通過(guò)git hooks的機(jī)制(在git repo發(fā)生特定的事件時(shí)觸發(fā)$GIT-DIR/hooks目錄下特定的腳本),可以完成在push代碼到遠(yuǎn)端的倉(cāng)庫(kù)的同時(shí),構(gòu)建、運(yùn)行docker容器,達(dá)到push-to-deploy的目的。

實(shí)踐 1. 環(huán)境:

一臺(tái)本地開(kāi)發(fā)的機(jī)器

一個(gè)第三方代碼托管平臺(tái),如github、coding

一臺(tái)屬于自己的linux服務(wù)器(用于部署)

一份用于交付的代碼,這里我用我最近在寫(xiě)的項(xiàng)目dockercd的后端代碼,項(xiàng)目結(jié)構(gòu)如下:,項(xiàng)目用python flask編寫(xiě),下面介紹幾個(gè)主要的文件。

2. 項(xiàng)目
Dockerfile:用于構(gòu)建整個(gè)項(xiàng)目的docker容器,代碼如下:
FROM ubuntu
MAINTAINER jockerxu 
RUN sed -i "s/archive.ubuntu.com/mirrors.163.com/g" /etc/apt/sources.list
RUN apt-get update

RUN apt-get install -y apt-utils 
    && { 
        echo debconf debconf/frontend select Noninteractive; 
        echo mysql-server mysql-server/data-dir 
            select ""; 
        echo mysql-server mysql-server/root_password 
            password "123456"; 
        echo mysql-server mysql-server/root_password_again 
            password "123456"; 
        echo mysql-server mysql-server/remove-test-db 
            select true; 
    } | debconf-set-selections 
    && apt-get install -y python-pip mysql-server

RUN mkdir -pv /app
ADD . /app
WORKDIR /app
RUN pip install -r requirements.txt
expose 5000
CMD ./docker-entrypoint.sh

備注:一般情況下,docker容器一般是一個(gè)容器一個(gè)進(jìn)程的原則,這里為了方便把項(xiàng)目代碼和mysql放在同一容器中。

docker-entrypoint.sh:docker 入口腳本
_FIRST_TIME=$1
# 第一次啟動(dòng)容器,需要初始化數(shù)據(jù)庫(kù)
if [[ $_FIRST_TIME == "true" ]]; then
    rm -rf /var/lib/mysql/*
    mysqld --initialize-insecure
    service mysql start
    mysqladmin -u root password "123456"
fi

service mysql start

python app.py

該文件主要在docker容器啟動(dòng)后,在容器內(nèi)部啟動(dòng)一些服務(wù)(這里是mysql)和項(xiàng)目的主進(jìn)程app.py。

run-project.sh:項(xiàng)目啟動(dòng)腳本
set -x
PROJECT_NAME=dockercd_backend
CONTAINER_NAME="$PROJECT_NAME"
IMG_NAME=img_"$PROJECT_NAME"
DATADIR=__data__"$PROJECT_NAME"
docker rm -f "$CONTAINER_NAME" 1>&2 2>/dev/null
docker build -t "$IMG_NAME" .
mkdir -pv "$DATADIR"
_FIRST_TIME="false"
if [[ $(ls -A "$DATADIR") == "" ]]; then
    _FIRST_TIME="true"
fi
docker run -t -d --name "$CONTAINER_NAME" -p 5000:5000 
    -v $(pwd)/"$DATADIR":/var/lib/mysql "$IMG_NAME" 
    /bin/sh -c "./docker-entrypoint.sh $_FIRST_TIME"
set +x

這個(gè)腳本是項(xiàng)目的環(huán)境構(gòu)建以及部署腳本,主要功能是根據(jù)Dockerfile build 出docker imags,然后從鏡像啟動(dòng)容器并掛載數(shù)據(jù)目錄$DATADIR。

項(xiàng)目介紹到此,下面開(kāi)始利用git hooks的事件機(jī)制實(shí)現(xiàn)push-to-deploy。

3. git hooks

(1)登陸自己的Linux服務(wù)器,初始化一個(gè)git bare目錄,初始化后以前其他項(xiàng)目中的.git文件夾的內(nèi)容。

mkdir -pv repo.git && cd repo.git && git init --bare 

(2)在另一個(gè)文件夾中創(chuàng)建用于部署的目錄deploy(用于git pull存放代碼的目錄),并通過(guò)git clone 關(guān)聯(lián)第一步的repo.git

mkdir -pv deploy && cd deploy && git init
git clone ssh://username@server_ip:ssh_port/path_to/repo.git

(3)回到repo.git文件夾,編輯hooks/post-receive(默認(rèn)不存在這個(gè)文件),這個(gè)文件就是一個(gè)shell腳本,當(dāng)有代碼git push到這個(gè)倉(cāng)庫(kù)的時(shí)候觸發(fā),內(nèi)容如下

unset GIT_DIR
DeployPath=/path_to/deploy
 
set -x
cd $DeployPath
git add . -A && git stash
git pull origin master
echo "pull code done"
./run-project.sh
echo "deploy done"
set +x  

主要功能就是進(jìn)入部署的目錄,拉取代碼,通過(guò)./run-project.sh啟動(dòng)項(xiàng)目。

(4)來(lái)到自己的本地開(kāi)發(fā)機(jī),通過(guò)git clone 獲取自己在github或者coding上項(xiàng)目的代碼,這里我的項(xiàng)目是上面提到的dockercd_backend,向項(xiàng)目添加一個(gè)遠(yuǎn)程倉(cāng)庫(kù)(這里是我們自己服務(wù)器的repo.git),然后提交代碼到my_server的repo.git,觸發(fā)hooks/post-receive腳本,deploy目錄開(kāi)始拉取代碼進(jìn)行部署。

git clone from_github_or_coding
git remote add my_server ssh://username@server_ip:ssh_port/path_to/repo.git
git push my_server master

至此,push-to-deploy完成。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/26936.html

相關(guān)文章

  • 帶著問(wèn)題學(xué) Kubernetes 基本單元 Pod

    摘要:后面會(huì)涉及以配置文件進(jìn)行部署。的調(diào)度完成,被分配到指定上。這是的一種最終狀態(tài)。圖相較而言,除了提供的基本功能,還支持聲明式的更新和回滾。共享數(shù)據(jù)存儲(chǔ)的問(wèn)題主要分為數(shù)據(jù)臨時(shí)存儲(chǔ)與持久性存儲(chǔ)。 帶著問(wèn)題學(xué) Kubernetes 基本單元 Pod 摘要:本文屬于原創(chuàng),歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)保留出處:https://github.com/jasonGeng88/blog 文章一:帶著問(wèn)題學(xué) Kube...

    pcChao 評(píng)論0 收藏0
  • 帶著問(wèn)題學(xué) Kubernetes 基本單元 Pod

    摘要:后面會(huì)涉及以配置文件進(jìn)行部署。的調(diào)度完成,被分配到指定上。這是的一種最終狀態(tài)。圖相較而言,除了提供的基本功能,還支持聲明式的更新和回滾。共享數(shù)據(jù)存儲(chǔ)的問(wèn)題主要分為數(shù)據(jù)臨時(shí)存儲(chǔ)與持久性存儲(chǔ)。 帶著問(wèn)題學(xué) Kubernetes 基本單元 Pod 摘要:本文屬于原創(chuàng),歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)保留出處:https://github.com/jasonGeng88/blog 文章一:帶著問(wèn)題學(xué) Kube...

    frontoldman 評(píng)論0 收藏0
  • Docker + Jenkins + webhooks 自動(dòng)部署基礎(chǔ)實(shí)踐

    摘要:自動(dòng)部署基礎(chǔ)實(shí)踐熟悉的基本操作實(shí)現(xiàn)本地后自動(dòng)構(gòu)建部署服務(wù)此實(shí)踐用于優(yōu)化自己在實(shí)際工作中的工作流在本地開(kāi)發(fā)到服務(wù)器登錄云服務(wù)器或者簡(jiǎn)化流程后本地開(kāi)發(fā)云服務(wù)器自動(dòng)構(gòu)建部署本實(shí)踐將結(jié)合技術(shù)來(lái)實(shí)現(xiàn)云服務(wù)器對(duì)各種環(huán)境的切換與部署。 Docker + Jenkins + webhooks 自動(dòng)部署基礎(chǔ)實(shí)踐 熟悉 jenkins 的基本操作 ?? 實(shí)現(xiàn)本地 git push 后 jenkins 自...

    Charlie_Jade 評(píng)論0 收藏0
  • AI開(kāi)發(fā)書(shū)籍分享

    摘要:編程書(shū)籍的整理和收集最近一直在學(xué)習(xí)深度學(xué)習(xí)和機(jī)器學(xué)習(xí)的東西,發(fā)現(xiàn)深入地去學(xué)習(xí)就需要不斷的去提高自己算法和高數(shù)的能力然后也找了很多的書(shū)和文章,隨著不斷的學(xué)習(xí),也整理了下自己的學(xué)習(xí)筆記準(zhǔn)備分享出來(lái)給大家后續(xù)的文章和總結(jié)會(huì)繼續(xù)分享,先分享一部分的 編程書(shū)籍的整理和收集 最近一直在學(xué)習(xí)deep learning深度學(xué)習(xí)和機(jī)器學(xué)習(xí)的東西,發(fā)現(xiàn)深入地去學(xué)習(xí)就需要不斷的去提高自己算法和高數(shù)的能力然后...

    huayeluoliuhen 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<