iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 23
0

build

該把程式打包了,先把dockerfile寫出來,在app中創建Dockerfile寫入

FROM golang
WORKDIR /app
ADD . /app
RUN cd /app && go build -o app
ENTRYPOINT ./app

解釋:

  • WORKDIR 定義docker內的工作環境
  • ADD . /app 將目前的資料夾"."以下的所有檔案與資料夾放到container裡的/app
  • RUN在docker環境內運行的指令
  • ENTRYPOINT 在執行docker run時的指令,使用encrypt我們可以像command line一樣直接在後面打參數,參數會被接在ENTRYPOINT後

有些東西不想一起包進docker,可以像.gitignore一樣寫個.dockerignore,把不想被打包的文件寫上,舉例:

# 忽略git
.gitignore
.git

# 說明文件
*.md

接著輸入

docker build -t your_user_name/your_app_name .

這樣就完成image,但問題來了,明明go就能直接編譯出獨立的執行檔,我們有必要把整個go環境都放到image裡嗎?

現在修改一下docker file

# build stage
FROM golang AS build-env
ADD . /src
RUN cd /src && CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app

# final stage
FROM scratch
COPY --from=build-env /src/app /
ENTRYPOINT ["/app"]

解釋:

  • AS將這個build的image重命名,之後就能用--from將裡面的資料轉到其他image上
  • scratch是docker的空image,連/bin/bash都沒有

現在build起來

docker build -t your_user_name/your_app_name .

來看看新的image有多大

$ docker images
REPOSITORY           	      TAG                 IMAGE ID            CREATED             SIZE
your_user_name/your_app_name  latest              b03308aef90d        21 minutes ago      17.3MB
nginx                         latest              4bb46517cac3        2 weeks ago         133MB
golang                        latest              75605a415539        2 weeks ago         839MB
mysql                         8.0                 0d64f46acfd1        3 weeks ago         544MB
vishnunair/docker-mkcert      latest              e664362accee        23 months ago       886MB

記得在run的時候把log,view,config等資料夾掛載上去

總結

今天把docker打包完了,明天要使用docker compose來把應用整合

目前的工作環境

.
├── app
│   ├── apperr
│   │   ├── error.go
│   │   └── handle.go
│   ├── common
│   │   └── cookie.go
│   ├── database
│   │   ├── auth.go
│   │   ├── connect.go
│   │   ├── error.go
│   │   ├── main.go
│   │   └── scheme.go
│   ├── Dockerfile
│   ├── go.mod
│   ├── go.sum
│   ├── log
│   │   ├── logger.go
│   │   └── logging.go
│   ├── main.go
│   ├── middleware
│   │   ├── auth.go
│   │   ├── error.go
│   │   └── log.go
│   ├── router
│   │   ├── account.go
│   │   ├── asset.go
│   │   ├── host_switch.go
│   │   └── main.go
│   ├── serve
│   │   ├── account.go
│   │   ├── asset.go
│   │   ├── auth.go
│   │   ├── main.go
│   │   └── main_test.go
│   ├── setting
│   │   └── setting.go
│   ├── util
│   │   ├── debug
│   │   │   ├── stack.go
│   │   │   └── stack_test.go
│   │   ├── file
│   │   │   └── file.go
│   │   ├── hash
│   │   │   ├── hash.go
│   │   │   └── hash_test.go
│   │   └── random
│   │       └── random.go
│   └── view
│       ├── css
│       ├── html
│       │   ├── component
│       │   │   ├── blogContainer.html
│       │   │   ├── blogList.html
│       │   │   ├── editor.html
│       │   │   ├── navigation.html
│       │   │   └── signContainer.html
│       │   └── meta
│       │       ├── head.html
│       │       └── index.html
│       └── js
│           ├── account.js
│           ├── editor.js
│           ├── main.js
│           ├── owner.js
│           └── sign.js
├── config
│   ├── app
│   │   ├── app.yaml
│   │   └── error.yaml
│   └── nginx
│       └── nginx.conf
└── database
    └── maindata

上一篇
Day22 本地SSL憑證
下一篇
Day24 Docker Compose
系列文
從coding到上線-打造自己的blog系統30

尚未有邦友留言

立即登入留言