本來准備用scratch來運行golang程序的,運行是可以但是遇到了時區的問題,且scratch是一個空鏡像也不方便做定制化
alpine是精簡版鏡像(約5.6M),默認不帶bash和timezone,但提供是包管理工具apk。也正是由於其精簡性便於在alpine的基礎上做定制化
測試看下alpine里的時間
先docker pull alpine拉取鏡像,再執行docker run --rm alpine date -R 查看alpine里的時間
看到時間后面的+0000就說明alpine默認是格林威治時間

解決辦法在alpine基礎上安裝bash並配置好時區,然后打包成新的鏡像,新鏡像約12.5M(比alpine大7M左右),然后基於定制化的alpine基礎上再build自己想要的鏡像來解決時間問題
步驟如下:
一、創建Dockerfile
vi Dockerfile
復制以下內容保存退出
FROM alpine
#更新Alpine的軟件源為國內源,提高下載速度
RUN echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.4/main/" > /etc/apk/repositories
RUN apk update \
&& apk upgrade \
&& apk add --no-cache bash \
bash-doc \
bash-completion \
&& rm -rf /var/cache/apk/* \
&& /bin/bash
# 設置時區為上海
RUN apk -U add tzdata && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone \
&& apk del tzdata
二、根據創建好的Dockerfile Build鏡像
創建好Dockerfile后直接build,注意在鏡像名稱前面要加上你的dockerid(我的dockerid是nickchou),不然后面沒法push
docker build -t nickchou/alpine-bash .
看到successfully就說明執行成功了

build好之后查看build成功后的鏡像
docker images

三、把本地鏡像alpine-bash上傳到hub.docker.com,便於跨服務器使用,不用每台服務器build
先登錄docker,然后填寫賬號密碼(沒有賬號可以去注冊一個 https://hub.docker.com/)
docker login

顯示Login Succeeded說明登錄成功,然后把剛build的本地鏡像push到官方
docker image push nickchou/alpine-bash:latest
push成功的截圖

登錄自己的賬戶也可以看到鏡像

push成功后可以退出登錄
docker logout

四、測試鏡像
先刪除本地鏡像,如果本地沒有build的話跳過
docker rmi nickchou/alpine-bash
重新遠程拉最新鏡像
docker pull nickchou/alpine-bash

分別查看alpine和nickchou/alpine-bash的時區
docker run --rm alpine date -R
docker run --rm nickchou/alpine-bash date -R
看到nickchou/alpine-bash時間后面的+0800就說明已經是東八區了

接着測試容器的bash(-rm指的是容器運行完成后刪除),退出容器按Ctrl+P+Q 或者exit
docker run -it --rm nickchou/alpine-bash

小結 :現在就可以基於這個鏡像去發布golang等就不存在時區和沒法docker exec -it的問題了,在Dockerfile第一行改為 FROM nickchou/alpine-bash就可以用現成的了,當然你也可以自己打包一個。
步驟三里面的發布docker.io只是為了方便以后其他服務器也可以直接用,如果只有一台服務器,步驟三可以忽略
五、推送到阿里鏡像庫加速
5.1 選擇加速的地區(如上海/杭州/北京等), 選擇默認實例(個人版本),因我的服務器是買在杭州所以鏡像服務也選杭州,其他地區類似
https://cr.console.aliyun.com/cn-hangzhou/instance/namespaces

公網和專有網絡地址在這

5.2 每個賬戶可以免費創建3個空間,注意選擇好 公開/私有

5.3 創建你一個倉庫名稱,用來推送鏡像,注意倉庫的地址是registry.cn-hangzhou.aliyuncs.com/szpub/alpine-bash

5.4 在之前創建好的鏡像基礎上再加一個tag,注意把下面的szpub空間名及后面的容器名替換為自己的
注意:szpub空間名后面最好不要再繼續划分層級,如szpub/aaa/alpine-bash 這樣雖然可以push成功但在倉庫網頁版中無法查看鏡像
sudo docker tag nickchou/alpine-bash registry.cn-hangzhou.aliyuncs.com/szpub/alpine-bash

5.5 登陸阿里雲鏡像倉庫,登錄名是阿里雲賬號全名,密碼為開通服務時設置的密碼(您可以在訪問憑證頁面修改憑證密碼)
sudo docker login --username=zhou****@163.com registry.cn-hangzhou.aliyuncs.com
查看登陸信息
cat /root/.docker/config.json
5.6 推送鏡像到阿里雲倉庫
sudo docker push registry.cn-hangzhou.aliyuncs.com/szpub/alpine-bash:latest
網頁版查看鏡像,如下圖

5.7 拉取鏡像
docker pull registry.cn-hangzhou.aliyuncs.com/szpub/alpine-bash
5.8 運行測試
docker run --rm registry.cn-hangzhou.aliyuncs.com/szpub/alpine-bash date -R

5.9 修改Dockerfile,相比從境外直接下載要快很多
FROM registry.cn-hangzhou.aliyuncs.com/szpub/alpine-bash
#FROM nickchou/alpine-bash
#FROM alpine
