




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、熟悉docker如何提升你在構(gòu)建、測試并部署go web應(yīng)用程序的方式,并幾理解如何 使川semaphore來持續(xù)部署。簡介人多數(shù)情況下go應(yīng)用程序被編譯成單個二進(jìn)制文件,web應(yīng)用程序則會包括模版和 配置文件。而當(dāng)一個項(xiàng)目中有很多文件的時候,由于很多文件沒有同步就會導(dǎo)致錯誤的發(fā)4: 并且產(chǎn)生很多的問題。在本教程111,你將啓習(xí)如何使用docker部署個go web應(yīng)用程序,并且認(rèn)識到docker 將如何改進(jìn)你的開發(fā)工作流及部署流程。各種規(guī)模的團(tuán)隊(duì)都會從這里所介紹的設(shè)置中受益。冃標(biāo)在本文結(jié)束后,你將:o對docker有基本的了解,o發(fā)現(xiàn)在docker將如何幫助你開發(fā)go應(yīng)用程序o學(xué)習(xí)如何為一個
2、生產(chǎn)環(huán)境中的go應(yīng)川程序創(chuàng)建docker容器o知道如何使用semaphore持續(xù)地在你的服務(wù)器上部署docker容器先決條件為了學(xué)習(xí)本教程,你講需要:o在你的主機(jī)或者服務(wù)器上安裝dockero具有一臺能夠使用ssh密鑰對ssh請求進(jìn)行認(rèn)證的服務(wù)器理解dockerdocker幫助你為應(yīng)用程序創(chuàng)建一個單獨(dú)的可部署單元。這個單元,也被稱為容器,包 含該應(yīng)用程序需要的所有東西。它包括代碼(或者二進(jìn)制文件)、untime (運(yùn)行環(huán)境)、 系統(tǒng)工具盒系統(tǒng)庫。將所有必需的資源打包成個單元將確保無論應(yīng)用程序部署到哪里都有 完全相同的壞境。這也有助于維護(hù)一個完全相同的開發(fā)和牛產(chǎn)配置,這在以前是很難追蹤的。一旦開
3、始,容器的創(chuàng)建和部署將自動完成。它消除了一大類問題。這些問題主要是山 于文件沒有同步或者開發(fā)和牛產(chǎn)環(huán)境z間的差異導(dǎo)致的。docker幫助解決了這些問題。相比于虛擬機(jī)的優(yōu)勢容器提供了與虛擬機(jī)相似的資源分配和隔離優(yōu)勢。然而,相同z處僅此而已。一個虛擬機(jī)需要它自己的客戶操作系統(tǒng)而容器共享主機(jī)操作系統(tǒng)的內(nèi)核。這意味著容 器更加輕量而月需要更少的資源。從木質(zhì)上講,一個虛擬機(jī)是操作系統(tǒng)中的一個操作系統(tǒng)。 而另一方面的容器則更像是操作系統(tǒng)中的其它應(yīng)用程序。棊木上,容器需要的資源(內(nèi)存、 磁盤空間等等)比虛擬機(jī)少很多,并旦具有比虛擬機(jī)快很多的啟動時間。docker在開發(fā)階段的優(yōu)勢在開發(fā)屮使用docker的優(yōu)勢
4、包括:o 一個用于所有團(tuán)隊(duì)成員的標(biāo)準(zhǔn)開發(fā)環(huán)境。更新的依賴性集中化以及在任何地方都能使用相同的容器o在開發(fā)和生產(chǎn)中完全相同的環(huán)境。修復(fù)了可能只會出現(xiàn)在生產(chǎn)環(huán)境中的潛在問題為什么使用docker運(yùn)行一個go web應(yīng)用程序?多數(shù)go應(yīng)用程序時簡單的二進(jìn)制文件。這就引發(fā)一個問題一為什么使用docker運(yùn)行 一個go應(yīng)用程序? 一些使用docker運(yùn)行g(shù)o的理由包括:o web應(yīng)用程序通常都有模版和配置文件。docker有助于保持這些文件與二進(jìn)制文件 的同步o docker確保了在開發(fā)或生產(chǎn)中完全相同的配置。很多吋候當(dāng)應(yīng)用程序可以在開發(fā)環(huán) 境中正常工作吋,在生產(chǎn)環(huán)境去無法正常工作。使用docker則把
5、你從對這些問題的擔(dān)心中 解放了出來。o在一個人型的團(tuán)隊(duì)小主機(jī)、操作系統(tǒng)及所安裝的軟件可能存在很大的不同。docker 提供了 種機(jī)制來確保致的開發(fā)環(huán)境配置。這將提升團(tuán)隊(duì)的生產(chǎn)力并tl在開發(fā)階段減少沖 突和可避免問題的發(fā)生。創(chuàng)建一個簡單的go web應(yīng)用程序在本文中味了演示,我們會用go創(chuàng)建一個簡單的web應(yīng)用程序。這個我們稱z為mathapp的應(yīng)用程序?qū)ⅲ簅探索不同數(shù)學(xué)運(yùn)算的路徑0在視圖中使川html模版o使用一個可配置的文件來定制化該應(yīng)用程序o包含所選功能的測試訪問/sum/3/6將顯示一個包含3與6相加后結(jié)果的頁面。同樣的,訪問/product/3/6 將顯示一個3和6乘積的頁面。在本文中
6、我們使用beego框架。請注意你可以為你的應(yīng)用亨旭使用任何框架(或者什 么也不用)。最終的目錄結(jié)構(gòu)完成之后,mathapp的目錄結(jié)構(gòu)應(yīng)該看起來如下:mathapp |conf |1app.conf |main.go |main_test.go 1views|泊 valid-route.html 1result.html我們假設(shè)mathapp h錄位于/ app h錄z中。應(yīng)用程序的主文件時main.go,為主應(yīng)用程序的根目錄屮。這個文件包含該應(yīng)用的所 有功能。一些main.go屮的功能是使用main_test.go來測試的。views文件夾中包含視圖文件invald-route.html和re
7、sult.html。配置文件app.conf 位于conf文件夾川。beego使用該文件來定制化應(yīng)用程序。應(yīng)用程序文件的內(nèi)容應(yīng)用程序主文件(main.go)包含所有的應(yīng)用程序邏輯。該文件的內(nèi)容如下:*/ main.go*package* main*import* (”strconv” ” the main function defines a single route, its handler*/ and starts listening on port 8080 (default port for beego)*func* main() */* this would match routes
8、 like the following:*/sum/3/5*/product/6/23*.*/*beego.router(7:operation/:num1 :int/:num2:inr, smaincontroller) beego.run()* this is the controller that this application uses*type* maincontroller *struct* beego.controller*/ get() handles all requests to the route defined above*func* (c *maincontroll
9、er) get() */obtain the values of the route parameters defined in the route above* operation := c.ctxput.param(n:operation”)num1, _ := strconv.atoi(c.ctx.lnput.param(”:num1”)num2, _ := strconv.atoi(c.ctx.lnput.param(n:num2n) */set the values for use in the template* c.data"operation” = operation
10、 c.data”num1” = num1 c.data”num?' = num2 c.tpiname = "result.html” */ perform the calculation depending on the 'operation' route parameter* *switch* operation *case* "sum”: c.datahresulth = add(num1, num2) *case* "product": c.datahresultn = multiply(num1, num2) "
11、default卄:c.tpiname = "invalid-route.html" *func* add(n1, n2 int) int *return* n1 + n2*func* multiply(n1, n2 int) int *return* n1 * n2在你的應(yīng)用程序中,它可能被分割到多個文件中。然而,針對木教程的目的,我們希 望事情簡單化。測試文件的內(nèi)容main.go文件有一些需要測試的功能。對于這些功能的測試可以在main_test.go小找 到。該文件的內(nèi)容如下:/ main_test.gopackagemainimport ”testing”functe
12、stsum(t *testing.t) if add(2, 5) != 7 t.fail()if add(2, 100) != 102 t.fail()if add(222, 100) != 322 t.fail()functestproduct(t *testing.t) if multiply(2, 5) != 10 t.fail()if multiply(2, 100) != 200 t.fail()if multiply(222, 3) != 666 t.fail()如果你想進(jìn)行持續(xù)的部署,那么對你的應(yīng)用程序進(jìn)行測試是特別有用的。如果你有了足夠的測試,那么你可以持續(xù)地部署而不必?fù)?dān)心在你
13、的應(yīng)川程序屮出現(xiàn)錯謀。視圖文件內(nèi)容視圖文件時html模版。應(yīng)川程序使川它們來顯示對請求的應(yīng)答。result.html的內(nèi)容如下:v! result.html -><!- this file is used to display the result of calculations -xidoctype html><html><headxtitle>mathapp .operation</title></head><body> the .operation of .num1 and .num2 is.result<
14、;/bodyx/html>invalid-route.html 的內(nèi)容如下:<!- invalid-route.html -><!- this file is used when an invalid operation is specified in the route -xidoctype html><html><headxtitle>mathapp</title><meta name="viewport,'content=”width=devicewidth, initial-scale=1&quo
15、t;><meta charset=,utf-8"x/headxbody invalid operation</bodyx/html>配置文件的內(nèi)容app.conf是beego用于配置應(yīng)用程序的文件。它的內(nèi)容如下:;app.confappname = mathapphttpport = 8080runmode = dev在這個文件中:o appname是應(yīng)川程序?qū)⒁\(yùn)行的進(jìn)程的名字o httpport是應(yīng)用程序?qū)⒁O(jiān)聽的的端口 runmode聲明了應(yīng)用程序?qū)⒁\(yùn)行的模式。有效的指包括dev用于開發(fā)而prod用于生產(chǎn)。在開發(fā)中使用docker本節(jié)將介紹在開發(fā)過程中
16、使用docker的好處,并且向你展示在開發(fā)中使用docker的必須步驟。配置docker用于開發(fā)我們將使用dockerfile來配置docker以便用于開發(fā)。針對開發(fā)壞境,對其的配置應(yīng)該滿足以下的要求:o我們將使用上一節(jié)所提及的應(yīng)用程序o這些文件無論從容器的內(nèi)部還是外部都可以訪問o我們將使用beego 口帶的bee工具。它用丁在開發(fā)過程中在線地重新加載應(yīng)用程序(在docker容器的內(nèi)部)o docker將為應(yīng)用程序開放8080端口o在我們的主機(jī)上,m用程序保存在/app/mathapp屮o在docker容器中,應(yīng)用程序保存在/go/src/mathapp中我們將為開發(fā)所創(chuàng)建的docker im
17、age的名字是ma-imageo我們將要運(yùn)行的docker容器的名字是mainstance步驟一一創(chuàng)建dockerfile如下的dockerfile可以滿足以上的要求:*from* golang:1.6*# install beego and the bee dev tool*run* go get go get expose the application on port 8080*expose* 8080*# set the entry point of the container to the bee command that runs the*# application and wat
18、ches for changes*cmd* ”bee”,”run”第一行,from golang:1.6將go的官方映像文件作為基礎(chǔ)映像。該映像文件預(yù)安裝了 go 1.6 該映像已經(jīng)把$gopath的值設(shè)宜到了 /go。所有安裝在/go/src'l'的包將能夠被go命令訪問。第二行,run go get go get 安裝beego包和bee工具。beego包將在應(yīng)用程序中使用。bee丄具用語在開發(fā)中 再現(xiàn)地重新加載我們的代碼。第三行,expose 8080在開發(fā)主機(jī)上利用容器為應(yīng)用程序開放8080端口。最后一行,cmd ,beeu, hrunn使用bee命令啟動應(yīng)用程序的在線
19、重新加載。步驟二一構(gòu)建image一旦創(chuàng)建了 docker file,運(yùn)行如下的命令來創(chuàng)建image:docker build t ma-image .執(zhí)行以上的命令將創(chuàng)建名為ma-image的image。該image現(xiàn)在可以用于使用該應(yīng)用 程序的任何人。這將確保這個團(tuán)隊(duì)能夠使用一個統(tǒng)一的開發(fā)環(huán)境。為了查看你的系統(tǒng)上的image列花運(yùn)行如下的命令:docker images這行該命令將輸出與以下類似的內(nèi)容:repository tag image id created sizema-image latest 8d53aa0dd0cb 31 seconds ago 784.7 mbgolang 1
20、.6 22a6ecf1f7cc 5 days ago 743.9 mb注意image的確切名字和編號可能不同,但是,你應(yīng)該至少看到列表屮有g(shù)olang和 ma-image image。步驟三一運(yùn)行容器一旦maimage已經(jīng)完成,你町以使用以下的命令啟動一個容器:docker run -it -rm -name ma-instance -p 8080:8080 /-v /app/mathapp:/go/src/mathapp -w /go/src/mathapp ma-image讓我們分析一下上而的命令來看看它做了什么。o docker run命令用于從一個image上啟動一個容器o -it標(biāo)簽
21、以交互的方式啟動容器orm標(biāo)簽在容器關(guān)閉后將會將英清除oname ma-instance 將容器命名為 mainstaneeo -p 8080:8080標(biāo)簽允許通過8080端口訪問該容器o -v /app/mathapp:/go/src/mathapp 更復(fù)雜些。它將主機(jī)的/app/mathapp 映射到容器中的/go/src/mathapp.這將使得開發(fā)文件在容器的內(nèi)部和外部都可以訪問。o ma-image部分聲明了用于容器的image。執(zhí)行以上的命令將啟動docker容器。該容器為你的應(yīng)用程序開發(fā)了 8080端ii。無論 何時你做了變更,它都將白動地重構(gòu)你的應(yīng)用程序。你將在console
22、(控制臺)上看到以下 的輸出:bee :1.4.1beego :1.6.1go :go version go1.6 linux/amd642016/04/10 13:04:15 info uses 'mathapp' as 'appname'2016/04/10 13:04:15 info initializingwatcher.2016/04/10 13:04:15 trac directory(/go/src/mathapp)2016/04/10 13:04:15 info start building.2016/04/10 13:04:18 succ bu
23、ild was successful2016/04/10 13:04:18 info restarting mathapp .2016/04/10 13:04:18 info ./mathapp is running.2016/04/10 13:04:18 asm_amd64.s: 1998i http server running on :8080為了檢查相關(guān)的設(shè)進(jìn),可以在瀏覽器中訪問。你講看到與卜面類似的東西:-c d localhost:8080/sum/4/5the sum of 4 and 5 is 9注意:這里假定你是在使用木地主機(jī)步驟四一開發(fā)應(yīng)用程序現(xiàn)在,讓我們看看這將如何在開發(fā)
24、階段提供幫助。在完成以下的操作時請確保容器在運(yùn)行。在# main.go #文件中,將第34行: c.data,operationh = operation改成:c.data"operatiort = "real" + operation在你保存修改的一刻,你講看到類似以卜的輸出:2016/04/10 13:17:51 even ,7go/src/mathapp/main.go,*: mod ify2016/04/10 13:17:51skip 7go/src/mathapp/main.goh: mod ify2016/04/10 13:17:52 info sta
25、rt building.2016/04/10 13:17:56 succ build was successful2016/04/10 13:17:56 inforestarting mathapp .2016/04/10 13:17:56 info ./mathapp is running.2016/04/10 13:17:56 asm_amd64.s: 1998i http server running on :8080為了檢查該變更,在你的瀏覽器中訪問。你將看到類似下面的輸出:g t g q localhost:8080/sum/4/5the real sum of 4 and 5 is
26、 9如你所見,你的應(yīng)用程序在保存了修改之麻自動地編譯并提供了服務(wù)。在生產(chǎn)中使用docker木節(jié)將講解如何在一個docker容器小部署go應(yīng)用程序。我們將使用semaphore來完 成以下的工作:o當(dāng)一個變更被推送到git資料庫后口動地進(jìn)行編譯o白動地運(yùn)行測試。如果編譯成功并且通過測試就創(chuàng)建一個docker映像o將docker映像文件推送入docker hubo更新服務(wù)器以便使用最新的docker映像創(chuàng)建一個生產(chǎn)用的dockerfile在開發(fā)過程中,我們的冃錄冇如下的結(jié)構(gòu):mathapp |conf |1app.conf |main.go |main_test.go 1views|invalid
27、 route.html 1result.html由于我們想要從項(xiàng)目中構(gòu)建docker映像,我們需要創(chuàng)建一個將用于生產(chǎn)環(huán)境的dockerfileo在項(xiàng)fl的根冃錄小創(chuàng)建一個dockerfile0新的fi錄結(jié)構(gòu)如下所示:mathapp |conf |1app.conf |dockerfile |main.go |main_test.go 1views |invalid-route.html 1result.html在dockerfile文件中輸入以下的內(nèi)容:from golang:1.6 create the directory where the application will resider
28、unmkdir/appcopy the application files (needed for production)addmathapp/app/mathappaddviews/app/viewsaddconf/app/c onfset the working directory to the app directoryworkdir/appexpose the application on port 8080. this should be the same as in the app.conf fileexpose8080set the entry point of the cont
29、ainer to the application executableentrypoint/app/mathapp讓我們具體看一下這些命令都做了什么。第一個命令,from golang: 1.6表明將基于我們在開發(fā)中使用的golang: 1.6映像構(gòu)建新的映像文件。第二個命令:run mkdir /app在容器的根里創(chuàng)建一個名為app的目錄,我們用其來保存項(xiàng)目文件。第三個命令集:add mathapp /app/mathappadd views /app/viewsaddconf /app/conf從主機(jī)中拷貝二進(jìn)制、視圖文件夾及配置文件夾到映像文件中的應(yīng)用程序h錄。第四 個命令:workdi
30、r/app在映像文件中把/app設(shè)置為工作冃錄。第五個命令:expose 8080在容器中開放8080端口。該端口應(yīng)該與應(yīng)川程序的app.conf文件中聲明的端口一致。 最后的命令:entrypoint /app/mathapp將映像文件的入口設(shè)置為應(yīng)用程序的二進(jìn)制文件。這將啟動二進(jìn)制文件的執(zhí)行并監(jiān)聽8080 端 m o自動地編譯及測試一旦你把代碼上傳到你的資料庫中semaphore將口動地對代碼進(jìn)行編譯和測試,一切 都變得簡單了。點(diǎn)擊這里了解如何添加你的github或bitbucket項(xiàng)h并口在semaphore上 設(shè)置golang項(xiàng)冃。一個go項(xiàng)目的缺省配置文件關(guān)注以下兒點(diǎn):o獲取相關(guān)文件
31、o編譯項(xiàng)目o運(yùn)行測試一旦你完成這個過程,就可以在semaphore儀表盤上看到最近的編譯和測試狀態(tài)。如 果編譯或測試失敗,該過程會終止而且也不會部署任何內(nèi)容。在semaphore上倉u建initial setup來實(shí)現(xiàn)自動部:署一旦你配置好了編譯過程,卜-步就是配置部署過程。為了部署應(yīng)用程序,你需要:1. 創(chuàng)建 docker image2. 將 docker image 推送入 docker hub3. 拉取新的image來更新服務(wù)器并基于該image啟動一個新的docker弈器作為開始,我們需要在semaphore上配置項(xiàng)冃實(shí)現(xiàn)持續(xù)部署。前三個步驟相對簡單:o選擇部署模式o選擇部署策略o選擇
32、在部署過程中使用的資料庫分支第四步(設(shè)置部署命令),我們將使用下一節(jié)中的命令。當(dāng)前暫空著并轉(zhuǎn)到下一步。在第五步屮,輸入你的服務(wù)器屮用戶的ssh私鑰。這將使得一些部署命令可以在你的 服務(wù)器上安全執(zhí)行而不需要輸入口令。在笫六部中,你可以命名你的服務(wù)器。如果你做的話,semaphore會給該服務(wù)器指定 一個類似server-1234這樣的隨機(jī)名字。在服務(wù)器上設(shè)置更新腳本z后,我們將配置部署過程,semaphore將創(chuàng)建新的image冰將其上傳到docker hub 屮。一旦完成,一個semaphore的命令將執(zhí)行你的服務(wù)器上的腳木來初始化更新過程。為了完成這個工作,我們需耍將名為update.sh的
33、文件放直到你的服務(wù)器屮。#!/bin/bashdocker pull $1 /ma-prod:latestifdocker stop ma-app; then dockerrm ma-app; fidocker run d p 8080:8080 name ma-app $1/ma-prodifdockerrmi $(docker images -filter "dangling=trueh -q-trunc); then :; fi使用如卜的命令給該文件賦予執(zhí)行權(quán)限:chmod 4-x update.sh讓我們來看一卜-該文件是如何使用的。這個腳本接收一個參數(shù)并且在命令中使用該參數(shù)
34、。這個參數(shù)應(yīng)該是你在docker hub ±的丿ij戶名。下面是使川該命令的例了:./update.sh docker_hub_username現(xiàn)在讓我們看一下這個文件屮的每一個命令來理解他們要做什么。第一個命令,docker pull $1/ma-prod:latest從docker hub上拉取最新的image到服務(wù)器屮。如果你在docker hub上的川戶名是 demo_user,該命令將拉取 docker hub i:標(biāo)記為 latest、名為 demo_user/ma-prod 的 image。第二個命令:ifdocker stop ma-app; then dockerr
35、m ma-app; fi停止并刪除之,前任何以maapp為名字而啟動的容器。第三個命令:docker run -d -p 8080:8080 -name ma-app $1/ma-prod使用在最近一次編譯中包涵變更的最新image來川動一個新的容器。最麻的命令:dockerrmi $(docker images -filter *'dangling=true” -q no-trunc)從服務(wù)器上刪除任何沒有用的imageo這種清理將保持服務(wù)器整潔并降低磁盤空間的 占用。注意:這個文件必須存放在用八主目錄中,而該用八就是之前的步驟中所用到的ssh 密鑰的所有者。如果文件的位直發(fā)住了變化
36、,則需要在后而的章節(jié)小相應(yīng)地更新部署命令。 配置項(xiàng)口使其能夠支持docker缺省情況下,semaphore ±的新項(xiàng)目使用ubuntu 14.04 lts v1603平臺。該平臺并 不支持dockero由于我們希望使用docker,我們需要修改semaphore的配置來使用ubuntu 14.04 lts v1603(beta with docker support)平臺。設(shè)置壞境變量為了在部署過程屮安全使用docker hub,我們需要把我們的證書保存在semaphore 自動初始化的環(huán)境變最屮。我們將保存以下的變量:o dh_username docker hub 用戶名o dh
37、_password 一 docker hub 口令o dh_email docker hub email 地址這里是如何以安全的方式設(shè)置環(huán)境變量。設(shè)置部署命令雖然我們完成了初始配置,但是實(shí)際上什么也不會部署。原因是我們在命令環(huán)節(jié)中都 述是空白。在第一步,我們將輸入用于完成部署過程的命令。為了完成這一步,請進(jìn)入semaphore 中你的項(xiàng)目主頁。q httptj/mmaphortctccxn 在這一頁上,點(diǎn)擊server欄屮服務(wù)器的名字。這將帶你進(jìn)入:點(diǎn)擊位于頁頭下方頁面右側(cè)的edit server按鈕。a hnp« > scmaphoreclcom 在隨后的一頁中,我們需要關(guān)注
38、標(biāo)題為deploy commands的最后一欄。點(diǎn)擊change deploy commands鏈接來開丿j命令編輯。rmp% semaphoreclcom 乃 mmaphorvdeploy ccmmemlt90 f /90 build *o rathapp q usfzhf p som 10m emaudocker build t oo*»rod docker uy m prodiutmt tth ifsermw/m prodiuteit(tocter ptnh ton mcmw/m prod:latest1rk1tkeycheckingoo four mtver utemmm*r
39、ouf 3 mmresswh usermare第翡城雨(obiiti 問 en在編輯框中,輸入如卜的命令并點(diǎn)擊save deploy commands按鈕:go get -v -d ./go build -v -0 mathappdocker login -u $dh_username -p $dh_password -e $dh_emaildocker build t ma-prod .docker tag ma-prod:latest $dh_username/ma-prod:latestdocker push $dhjjsername/ma-proddatestssh -ostricth
40、ostkeychecking=no your_server_usernameyour_ip_address ”/update.sh $dh_username”注意:請確定用正確的值替換 your_server_usemameyour_ip_address。讓我們具體看一下每個命令。前兩個命令go get和go build是go的標(biāo)準(zhǔn)命令用于獲取相關(guān)文件并和應(yīng)地編譯項(xiàng)目。 注意go build命令說聲明的二進(jìn)制文件名應(yīng)該是mathapp。這個名字應(yīng)該與dockerfile中使 用的名字相同。第三個命令,docker login -u $dh_username -p $dh_password -e $dh_email使用環(huán)境變量實(shí)現(xiàn)在docker hub ±的認(rèn)證,從而使得我們能夠推送最新的image。第四個命令, docker build t ma-prod .基于最新的代碼庫萊創(chuàng)建docker image。第五個命令,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 兔子領(lǐng)養(yǎng)合同范本
- 廠家銷售廠房合同范本
- 供用電合同范本高壓
- 東城區(qū)恒溫配送合同范本
- 代建租賃住房合同范本
- 單方贈與協(xié)議合同范本
- 華為碎屏險合同范本
- 廠區(qū)工地勞務(wù)合同范本
- 2025重慶市安全員《B證》考試題庫及答案
- 2025河南省建筑安全員-A證考試題庫附答案
- 六年級下冊音樂全冊教案湖南文藝出版社湘教版
- Tracepro-實(shí)例學(xué)習(xí)教程
- 進(jìn)貨單出貨單(Excel表格模板)
- 綜合日語第二冊練習(xí)冊(修訂版)答案精編版
- 公眾責(zé)任保險實(shí)用教案
- 吳齊南先生生平
- 守株待兔中英文PPT課件
- 質(zhì)監(jiān)站對監(jiān)理工作監(jiān)督的要點(diǎn)
- 2020年英語筆譯二級綜合能力樣題
- 《20世紀(jì)的藝術(shù)大師——馬蒂斯》參考教案1
- 中 國 作 家 協(xié) 會 入 會 申 請 表
評論
0/150
提交評論