国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

將你的前端應(yīng)用打包成docker鏡像并部署到服務(wù)器?僅需一個(gè)腳本搞定

bluesky / 577人閱讀

摘要:前言前段時(shí)間,自己搞了個(gè)阿里云的服務(wù)器。編寫服務(wù)器部署腳本從上面步驟來看,我們還需要一個(gè)服務(wù)器端的部署腳本。服務(wù)器一個(gè),本地一個(gè)簡稱只需一個(gè)腳本。最終我達(dá)成了滿足我需求的一個(gè)方便的部署腳本。

1.前言

前段時(shí)間,自己搞了個(gè)阿里云的服務(wù)器。想自己在上面折騰,但是不想因?yàn)樽约合拐垓v而污染了現(xiàn)有的環(huán)境。畢竟,現(xiàn)在的阿里云已經(jīng)沒有免費(fèi)的快照服務(wù)了。要想還原的話,最簡單的辦法就是重新裝系統(tǒng)。而一旦重裝,之前的搭建的所有環(huán)境就都白搭了。

再加上之前本身就想引入docker,所以就打算利用docker容器來部署這次的前端應(yīng)用。

2.構(gòu)建前端應(yīng)用

在打包之前,首先需要一個(gè)可正常運(yùn)行的前端應(yīng)用。這個(gè)可以使用umi或者create-react-app來構(gòu)建。

3.nginx的默認(rèn)配置文件

然后需要在項(xiàng)目中加上默認(rèn)nginx配置文件。

server {
    listen 80;
    server_name localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html;
    }
}
4.編寫本地構(gòu)建腳本 4.1. 移除上次的目錄和Dockerfile
#!/bin/bash

if [ -d "./dist" ]; then
    rm -rf ./dist
fi

if [ -f "./Dockerfile" ]; then
    rm -f ./Dockerfile
fi

因?yàn)槊看胃暮骴ist中的內(nèi)容肯定與之前不同,其實(shí)這一步顯得不是那么必要。運(yùn)行npm的打包命令也會(huì)自動(dòng)清楚該目錄。

而清除Dockerfile則是為了防止更新了Dockerfile,而這次卻不能得到最新的配置。

4.2. 打包前端應(yīng)用

執(zhí)行前端的打包命令,生成靜態(tài)文件目錄。

yarn build
4.3. 生成Dockerfile
echo "FROM nginx:latest" >> ./Dockerfile
echo "COPY ./dist /usr/share/nginx/html/" >> ./Dockerfile
echo "COPY ./default.conf /etc/nginx/conf.d/" >> ./Dockerfile
echo "EXPOSE 80" >> ./Dockerfile

FROM制定了該定制容器的基礎(chǔ)鏡像為nginx:latest;COPY命里將打包好的靜態(tài)文件目錄復(fù)制到容器內(nèi)的/usr/share/nginx/html/目錄下,然后將nginx的配置寫入容器中對應(yīng)的位置; EXPOSE則是設(shè)置對外暴露容器的80端口。

4.4. 生成并推送定制image
docker build -t detectivehlh/mine .
docker login -u detectivehlh -p ********
docker push detectivehlh/mine

這里是在開發(fā)本地,使用docker命令來打包,所以該腳本對docker有強(qiáng)依賴。build命令表示打包docker應(yīng)用的,-t選項(xiàng)則制定了docker鏡像的名字和tag,tag會(huì)默認(rèn)為latest。

然后登錄dockerHub,將定制好的鏡像推送到dockerHub中。detectivehlh就是dockerHub的用戶名,mine是image的名字。

4.5. 刪除tag為none的無用image

第一次構(gòu)建不會(huì)生成tag為none的image,但是后面每次再次執(zhí)行該命令就會(huì)出現(xiàn)這樣的情況。所以每次構(gòu)建了一個(gè)新的image后,需要清除調(diào)不需要的image。

docker images | grep none | awk "{print $3}" | xargs docker rmi

使用grep命令匹配到tag為none的image,awk是一個(gè)強(qiáng)大的文本分析工具,{print $3}表示打印出匹配到的每一行的第三個(gè)字段,也就是docker的image id。如果是$0的話表示當(dāng)前整行的數(shù)據(jù)。

xargs是一個(gè)給其他命令(也就是后面的docker rmi)傳遞參數(shù)的一個(gè)過濾器,將標(biāo)準(zhǔn)輸入轉(zhuǎn)換成命令行參數(shù)。

總結(jié)來說,上述命令就是找到tag為none的image的ID,然后使用docker rmi命令移除該image。

4.6. 執(zhí)行部署
cmd="cd ~ && sh deploy.sh mine"
ssh -t USER_NAME@IP_ADDRESS "bash -c "${cmd}""

通過ssh命令,登錄遠(yuǎn)程服務(wù)器,并且執(zhí)行參數(shù)中的腳本。

deploy.sh是放在服務(wù)端的構(gòu)建腳本。放在默認(rèn)的登錄用戶下。我們發(fā)現(xiàn),后面還跟了個(gè)mine,這是在服務(wù)器上運(yùn)行的docker鏡像的名字。這里暫時(shí)沒有對container的名字加上hash,因?yàn)樽约旱男№?xiàng)目,暫時(shí)沒有必要。

在項(xiàng)目中的完整構(gòu)建腳本如下。

#!/bin/bash

if [ -d "./dist" ]; then
    rm -rf ./dist
fi
if [ -f "./Dockerfile" ]; then
    rm -f ./Dockerfile
fi

yarn build

echo "FROM nginx:latest" >> ./Dockerfile
echo "COPY ./dist /usr/share/nginx/html/" >> ./Dockerfile
echo "COPY ./default.conf /etc/nginx/conf.d/" >> ./Dockerfile
echo "EXPOSE 80" >> ./Dockerfile

docker build -t detectivehlh/mine .
docker login -u detectivehlh -p ********
docker push detectivehlh/mine

docker images | grep none | awk "{print $3}" | xargs docker rmi

cmd="cd ~ && sh deploy.sh mine"
ssh -t USER_NAME@IP_ADDRESS "bash -c "${cmd}""
5. 編寫服務(wù)器部署腳本

從上面步驟來看,我們還需要一個(gè)服務(wù)器端的部署腳本。大家可能會(huì)說,標(biāo)題不是說一個(gè)腳本搞定嗎?em。。。服務(wù)器一個(gè),本地一個(gè)...簡稱只需一個(gè)腳本。

5.1 接收參數(shù)

在本地的構(gòu)建腳本中,我們傳入了docker運(yùn)行的container的名字。在服務(wù)器構(gòu)建腳本中需要來接收它。然后更新剛剛推送的docker image。

#!/bin/bash
name=$1
docker pull detectivehlh/$name
5.2. 啟動(dòng)container

在啟動(dòng)container時(shí)我們會(huì)面對兩種情況,名字為傳入?yún)?shù)的container已經(jīng)在運(yùn)行了。而在此時(shí)如果再次運(yùn)行docker run命令就會(huì)報(bào)錯(cuò)而導(dǎo)致我們無法使用最新的container,也無法達(dá)到更新應(yīng)用的目的。

if docker ps | grep $name | awk {"print $(NF)"} | grep -Fx $name; then
    echo "Container mine is already start"
    docker stop $name
    docker rm $name
    docker run -d --name $name -p 3000:80 detectivehlh/$name
else
    echo "Container mine is not start!, starting"
    docker run -d --name $name -p 3000:80 detectivehlh/$name
    echo "Finish starting"
fi
docker images | grep none | awk "{print $3}" | xargs docker rmi

所以在這里做一個(gè)判斷,第一個(gè)if判斷如果存在名字為傳入?yún)?shù)的container正在運(yùn)行,就停止當(dāng)前容器再重新啟動(dòng)。如果不存在則直接啟動(dòng)容器。

run命令就不過多解釋了。-d表示后臺運(yùn)行容器并返回容器ID,--name表示設(shè)置容器的名字,-p表示設(shè)置端口,將阿里云服務(wù)器的3000端口映射到容器的80端口,最后一句表示要啟動(dòng)哪個(gè)image(好像還是解釋了一遍)。

最后一句就是移除多次更新后出現(xiàn)的tag為none的無用鏡像。完整的腳本如下。

#!/bin/bash
name=$1
docker pull detectivehlh/$name
if docker ps | grep $name | awk {"print $(NF)"} | grep -Fx $name; then
    echo "Container mine is already start"
    docker stop $name
    docker rm $name
    docker run -d --name $name -p 3000:80 detectivehlh/$name
else
    echo "Container mine is not start!, starting"
    docker run -d --name $name -p 3000:80 detectivehlh/$name
    echo "Finish starting"
fi
docker images | grep none | awk "{print $3}" | xargs docker rmi
6. 如果你只是想打個(gè)包

看到標(biāo)題進(jìn)來的兄dei,如果只是想打包一個(gè)docker鏡像,那么你只需要Dockerfile文件和docker build命令就OK了。

7. 總結(jié)

最初寫這個(gè)腳本,主要目的是為了方便。所以腳本中為了達(dá)到這個(gè)目的做了一些調(diào)整。最終我達(dá)成了滿足我需求的一個(gè)方便的部署腳本。

它的方便體現(xiàn)在,當(dāng)我完成了項(xiàng)目代碼的更新,只需要跑一下這個(gè)腳本,然后等待一會(huì)兒,項(xiàng)目就會(huì)自動(dòng)打包成docker image,并且自動(dòng)的在我的服務(wù)器上運(yùn)行該container。

但是這種方式會(huì)給實(shí)際的生產(chǎn)環(huán)境帶來一些不可控的問題。比如,腳本必須不能上傳,因?yàn)樯婕耙恍┓?wù)器的敏感信息。但是如果你不小心上傳了,那你的服務(wù)器就相當(dāng)于裸奔了;再比如,你對你的代碼必須要十分自信,沒有經(jīng)過測試的代碼就直接部署,會(huì)帶來一些風(fēng)險(xiǎn)。

如果是自己用的,那完全不用擔(dān)心,想怎么搞怎么搞。但是如果是開放給所有人用的并且有一定的訪問量,比如博客,那么對于其他用戶來說,這種方式就不怎么友好。

所以我的觀點(diǎn)是,分情況來。目前來說我的項(xiàng)目只有少數(shù)幾個(gè)人在用,也還在處于迭代階段。并且代碼倉庫是私有的,所以我完全不用擔(dān)心隱私的問題。服務(wù)未經(jīng)測試就直接上線對于我來說,其實(shí)問題也不大。首先我會(huì)在本地測試,確認(rèn)無誤后才會(huì)執(zhí)行部署操作。所以在不同的階段,找到最適合自己的方案就OK。

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

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/103803.html

相關(guān)文章

  • 你的前端應(yīng)用打包docker鏡像部署務(wù)器僅需一個(gè)腳本搞定

    摘要:前言前段時(shí)間,自己搞了個(gè)阿里云的服務(wù)器。編寫服務(wù)器部署腳本從上面步驟來看,我們還需要一個(gè)服務(wù)器端的部署腳本。服務(wù)器一個(gè),本地一個(gè)簡稱只需一個(gè)腳本。最終我達(dá)成了滿足我需求的一個(gè)方便的部署腳本。 1.前言 前段時(shí)間,自己搞了個(gè)阿里云的服務(wù)器。想自己在上面折騰,但是不想因?yàn)樽约合拐垓v而污染了現(xiàn)有的環(huán)境。畢竟,現(xiàn)在的阿里云已經(jīng)沒有免費(fèi)的快照服務(wù)了。要想還原的話,最簡單的辦法就是重新裝系統(tǒng)。而一...

    My_Oh_My 評論0 收藏0
  • 使用 Docker 搭建前端 Java 開發(fā)環(huán)境

    摘要:解決的痛點(diǎn)免搭建后端開發(fā)環(huán)境。開發(fā)環(huán)境改變只需要改變鏡像就能同步更新。啟動(dòng)這個(gè)新建的鏡像。 這篇文章是為了解決前后端開發(fā)沒有徹底分離的坑,因?yàn)槲宜居玫氖莏ava,入職第一天就是搭建本地開發(fā)環(huán)境,看見了多年不見的eclipse的圖標(biāo)出現(xiàn)我的電腦上,我是難過的。后來知道并不是我一個(gè)人有此感受。依稀記得有個(gè)同學(xué)整整一天項(xiàng)目都沒跑起來的崩潰感。為了解決這個(gè)問題我們嘗試了很多方案,但是大大小小都...

    microelec 評論0 收藏0
  • 使用 Docker 搭建前端 Java 開發(fā)環(huán)境

    摘要:解決的痛點(diǎn)免搭建后端開發(fā)環(huán)境。開發(fā)環(huán)境改變只需要改變鏡像就能同步更新。啟動(dòng)這個(gè)新建的鏡像。 這篇文章是為了解決前后端開發(fā)沒有徹底分離的坑,因?yàn)槲宜居玫氖莏ava,入職第一天就是搭建本地開發(fā)環(huán)境,看見了多年不見的eclipse的圖標(biāo)出現(xiàn)我的電腦上,我是難過的。后來知道并不是我一個(gè)人有此感受。依稀記得有個(gè)同學(xué)整整一天項(xiàng)目都沒跑起來的崩潰感。為了解決這個(gè)問題我們嘗試了很多方案,但是大大小小都...

    go4it 評論0 收藏0
  • 使用 Docker 搭建前端 Java 開發(fā)環(huán)境

    摘要:解決的痛點(diǎn)免搭建后端開發(fā)環(huán)境。開發(fā)環(huán)境改變只需要改變鏡像就能同步更新。啟動(dòng)這個(gè)新建的鏡像。 這篇文章是為了解決前后端開發(fā)沒有徹底分離的坑,因?yàn)槲宜居玫氖莏ava,入職第一天就是搭建本地開發(fā)環(huán)境,看見了多年不見的eclipse的圖標(biāo)出現(xiàn)我的電腦上,我是難過的。后來知道并不是我一個(gè)人有此感受。依稀記得有個(gè)同學(xué)整整一天項(xiàng)目都沒跑起來的崩潰感。為了解決這個(gè)問題我們嘗試了很多方案,但是大大小小都...

    dreamGong 評論0 收藏0
  • 前端需要了解的 Docker 與 Kubernetes 知識

    摘要:打開終端執(zhí)行,再開一個(gè)終端輸入輸出,則表示該服務(wù)沒有問題。將服務(wù)打包成鏡像,然后將鏡像實(shí)例化并運(yùn)行,方便部署。此處以我的賬號為例,需要推送到你自己的賬號。是一種自動(dòng)化運(yùn)維工具,本文主要需要了解,,三個(gè)概念。至此成功使用部署應(yīng)用。 本文將以一個(gè)簡單的示例演示如何使用 Docker 與 Kubernetes 部署應(yīng)用上線。 Http Service 首先使用 Go 語言搭建一個(gè)簡單的 Ht...

    ChristmasBoy 評論0 收藏0

發(fā)表評論

0條評論

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