搜尋

搜尋結果

Docker環境參數化 - Arg VS Env
科技新知
MacauYeah・2024-03-26

Docker Variable control 我們在Docker Image的打包時,最簡單當然就是每個步驟都使用最新版本。例如Docker Base Image,大家可能選用latest tag,安裝linux package (Linux包),也可能就apt install yum 安裝最新的穩定版本。但如果我們想要更好地做測試,就要使用指定版本,方便追蹤問題。而Docker在打包和運行時,都有不同的方式讓大家定義或覆寫指定參數。 Docker build arg 我們先從打包Image開始。 例如我們需要使用一個Base image為 ubuntu,版本預設為22.04,但有需要時可以經build指令覆寫,可以這樣寫 ARG ubuntu_version=22.04 FROM ubuntu$ubuntu_version # default ubuntu_version=22.04 docker image build t test2204 . # or overwrite by buildarg docker image build t test2404 buildarg=quot;ubuntu_version=24.04quot; 雖然Dockerfile的RUN指令都是使用linux shell,但在Dockerfile中想表達條件控制(if else statment)就不太易看。在外部加入script做控制,是另一個可行的後備選擇,它更可以連image名字也進行參數化。 # in bash script, you also can if $beta == true then ubuntu_version=24.04 else ubuntu_version=22.04 fi docker image build t test$ubuntu_version buildarg ubuntu_version=$ubuntu_version Docker Container Run and Docker Compose 一般來講,Linux Container 在執行時,就等於進入Linux Shell。也就是,我們可以使用Shell中的環境變數。 我們在打包Image前,已經可以在Dockerfile中定義自己的ENV數參(也就是環境變數)。與前面的Build Arg有所不同的是,ENV是定義在Dockerfile中,在Container運行時以環境變數的形式存在,它也可以在運行中被改變。而Arg,則只在打包Image時存在,運行期間就不存在了。(當然,你在打包時,用Arg傳入Env,以運到這個目的。) 另一個更特別的性質是,那怕ENV沒有定義在Dockerfile中,我們運行時也可以加入更多的環境變數,大家就當成是一般Linux操作,隨時在自己的shell中加入變數。 # e, env for inline variable # envfile for file docker container run e MYVAR1 env MYVAR2=foo envfile .env.list ubuntu bash 同樣地Docker compose,也支援環境變數。筆者建議environment可以使用Array格式,日後可以更方便地直接改為env_file。 # dockercompose.yaml services ubuntu image ubuntu22.04 environment RACK_ENV=development SHOW=true USER_INPUT 上述的寫法沒有任何問題,不過如果你的dockercompose.yaml是放在git等版本控制中,你更新環境變數就有可能會影響到其他人,這時你就會想轉成env_file。 dockercompose.yaml預設就會讀當前資料夾的.env,就算不存在,也可以正常運行。(當然,大家的ImageContainer應該要有預設值) # dockercompose.yaml services ubuntu image ubuntu22.04 # if env_file is not defined, it will load .env. # or you can load the specific file. # env_file # .a.env env_file內,每一行就是一個變數 # .env or a.env RACK_ENV=development SHOW=true USER_INPUT 使用預設的.env還有一個好處,就是我們可以把dockercompose.yaml也變成受環境變數控制。 # dockercompose.yaml with variable control, only works in default .env services ubuntu image ubuntu$ubuntu_version # .env ubuntu_version=22.04

Swarm mode 上線 5 - load balancer | 還有那些事該考量?
科技新知
MacauYeah・2024-11-18

前面介紹了 ingress network ,亦介紹了 proxy gateway 。能做到的基本都做到了,再來就是考量安全性的問題。因為加了 proxy gateway ,前述的例子是所有 service ,都放在同一個 yaml 檔中。好處是,所有相關的東西存放在同一個檔中, gateway ,背後的 service 都一眼看到。但壞處就是有其中一個 service 更新,都要改那個 yaml 檔。更大的問題是, stack deploy 的指令,不單只更新其中一個 service ,就連其他 service 都會自動取得最新 image 而 redeploy 。 對於一個緊密的系統來講,同步更新可能不是大問題。但對於一些預定排程發佈的系統可不能這樣因為副作用而更新了。如果你也有這樣的分開管理需求,可以參考下面做法,把 gateway service 及 upstream service 放在不同的檔案中,然後經過 external network把所有 service 串連起來。 # nginxstack.yaml, docker stack deploy c nginxstack.yaml nginx services httpgateway image httpgateway ports 80808080 deploy replicas 1 update_config delay 10s restart_policy condition onfailure # managerstack.yaml services managerhttp image bretfisherhttpenv networks nginx_default default deploy replicas 3 update_config delay 10s restart_policy condition onfailure placement constraints node.labels.zone==manager networks nginx_default external true # dmzstack.yaml services dmzhttp image bretfisherhttpenv networks nginx_default default deploy replicas 2 update_config delay 10s restart_policy condition onfailure placement constraints node.labels.zone==dmz networks nginx_default external true 這樣,不同 service 的維護人員,就可以獨自控制自己的檔案。在第一次發佈時,確認 nginxstack.yaml 先行發佈就可以了。對應的發佈指令是docker stack deploy c nginxstack.yaml nginx,它會自動産生一個 nginx_default (即 stack名字_default )的網絡。之後其他service,就可以經networks的設定找到它了。 services YOUR_SERVICE networks nginx_default default networks nginx_default external true 上述即使分離檔案,在安全性考量時還是有一個問題,就是 ingress network 的問題。試想一下,dmzhttp (Demilitarized Zone)原本被設定的原因,就是想限制某些訪問只能一些可以公開的服務。但因為經過 ingress network 之後,它們會在所有機器上開放這些 port。那就是,以下面的例子來講,若 dmzhttp 是公開的服務, intrahttp 是內部服務,即使用 intrahttp 使用不同的port 8889。但一經 swarm mode 預設的 ingress network ,在node.labels.zone==dmz的那些節點,還是可以訪問到 intrahttp 。 services dmzhttp image bretfisherhttpenv ports 88888888 deploy replicas 2 update_config delay 10s restart_policy condition onfailure placement constraints node.labels.zone==dmz intrahttp image bretfisherhttpenv ports 88898888 deploy replicas 3 update_config delay 10s restart_policy condition onfailure placement constraints node.labels.zone==intra 我們前述介紹的 proxy gateway ,其實已經有一定程度可以解決這個問題。因為 proxy gateway 是根據 http 協定中的 host header 去做分流。在邊界網絡進來的「合法」訪問,道理上會好好地經引導到我們的 dmzhttp 。不過網路的邪惡可容小看, proxy gateway 也會有被騙的一日。有特定能力的攻擊者,只需找到目標域名,還是可以接觸到 intrahttp 。 若要做進一步隔離,在這種情況下,我們可以在 dmz , intra 機器中各設定一套 swarm ,完全獨立,這是最安全的做法。但這樣做的管理成本就會變高,因為兩個網段都會有自己的 manager 節點,而且在 dmz 網段的 manager 節點也有被攻擊的可能。 若我們回到單一 swarm 的方向,可以修改各個 service 中的 port 和 deploy 。利用 post mode 中的「host」,配合 deploy mode 中的「global」,完全跳開 ingress network。 services dmzhttp image nginx ports target 80 published 8888 mode host deploy mode global update_config delay 1s restart_policy condition any placement constraints node.labels.zone==dmz intrahttp image bretfisherhttpenv ports target 8888 published 8888 mode host deploy mode global update_config delay 10s restart_policy condition onfailure placement constraints node.labels.zone==intra 上面的例子中, dmzhttp 會在所有 dmz 的機器中,每個節點只運行一份服務,而且直接使用該機的 8888 port ,外面不會再有 ingress network 的 存在。同樣地,intrahttp 會在 intra 的所有節點,運行一份服務,佔用它們的8888 。這兩個服務,即使使用一個 port ,swarm 也不會說有任何問題。因為它們不會經 ingress network 搶佔其他人的 8888。 可能會有讀者問,如果 host mode 這麼安全,為什麼預設會是 ingress network,那我們就要先了理清 ingress network 與 host mode 有有什麼分別?假設我們只運行一個service,它佔用8888。 功能ingress modehost mode replicas 數 同一個 service replicas 為任意數量,什至比節點的數目多 因為有 port 限制,每個節點最多只能運行一份 Virtual IP Virtual IP 任意在節點中跳轉也可以,因為 ingress 會自動找到對應的 service 所在的節點 Virtual IP必需要與 service 所在節點綁定,其他節點訪問不到 load balance 有 沒有 host mode 就像我們傳統在各自的節點上自行佈署自己的程序,各個節點只有一份。所以不會有自動 load balance 的效果,如果客戶端訪問固定的IP,就會得到是固定的接器接受請求。我們有需要,就要在前面加一個 Proxy Gateway 或 HA proxy 。 Virtual IP 也一樣, host mode 下需要好好地自動跟著 service 的生命期,不過幸運的是, Docker 預設己經有自動重啟 service 功能,即前文中的 restart_policy ,它在 host mode 下也適用。如果大家有配合 deploy 中的 global mode , Virtual IP 的並沒有實際變動。但如果沒有 global mode ,就要再想想辦法了。 最後考慮 load balance 的問題,如果進入點的 service 的真的不太消耗資源,沒有 load balance 也是可以的 ,但若超負荷,就必需要自建 proxy gateway 。經過進入點後,若我有背後的 service 就沒有所謂的 ingress 和 host mode 選擇。

你家也有不愛睡覺的孩子嗎?
其他
皓芯・2022-09-25

對很多父母來說,一到睡覺時間,讓孩子入睡是件挺棘手的問題,因為孩子總是不肯睡覺,或是會藉故拖延,怎麼辦呢? 本書《月亮晚安》,自1947年出版以來,史上最經典的晚安書。是作者以孩子的感官視角寫的睡前故事書,不同的譯文版本發行已超過1000萬本。甚至被紐約公共圖書館選入「本世紀具有影響力的經典書籍之一」。 作者瑪格麗特bull;懷茲bull;布朗(Margaret Wise Brown),美國圖畫書界先驅性人物,也是重要的實驗兒童文學作家,四次凱迪克獎獲得者。她曾擔任編輯,發掘許多重要的童書作家與插畫家;她也曾特創作的許多深受歡迎的作品,重要的作品有《月亮晚安》、《逃家小兔》等,另外以筆名Golden MacDonald發表的《小島》和《Little Lost Lamb》二書更榮獲凱迪克大獎。 在這本書故事書中,當夜晚來臨,可愛的綿羊和袋鼠、小貓都睡著了。小兔子準備上床睡覺,但是小兔似乎還不甘心入眠,牠向著房間裡的每一樣東西道一一晚安。 本書內頁是黑白和彩色交替變化,房間的插圖是彩色頁,而物件的是黑白頁,視覺上的交替切換,能讓孩子仔細觀察這個房間的物件。 天黑了,夜晚來臨,就讓孩子跟房間裡的東西說聲晚安吧!睡覺是一種短暫的告別,本書可讓孩子感受夜晚氣息,很適合作為睡前讀物,哄孩子進入甜蜜夢鄉。 《月亮,晚安》 作者: 馬格麗特.懷茲.布朗 譯者: 黃迺毓 繪者: 克雷門.赫德 出版社:上誼文化公司 出版日期:20210601 ISBN:9789577627032 訂購地點 鞠智繪本屋 圖片來源 博客來

【懷舊台風】滿滿台灣懷舊風味的手遊─恆樂町,一起打造您的專屬小鎮!
手機‧電玩
星爸爸茶座・2020-01-20

春節臨近,本期星爸推介一個滿滿台灣風味的休閒手遊給大家打發節日時間。恆樂町是一款2018年推出的經營類休閒手遊,推出時間雖較早,因遊樂類型較小眾化,相信很多朋友亦未曾聽聞,但其獨特的台灣風味也值得讓喜歡經營遊戲的朋友一試。 遊戲講述落泊主角來到名為恆樂町的小鎮,在這裡開始大展拳腳經營商業王國的故事。遊戲最特別就是其重塑1930年代台灣風貌,讓玩家體驗重臨該時代的生活,適逢春節活動,遊戲更增加趕年獸等小遊戲,玩家亦可按喜好裝飾自已的小鎮,如路面風格、街燈、春節裝飾等,讓玩家遊戲內外都感受到新春氣氛。 《恆樂町》星爸評分5星為最高: 畫面精緻度:3.0 ★★★ 上手困難度:1.0 ★ 遊戲耐玩度:1.5 ★☆ 綜合娛樂性:2.5 ★★☆ 適合人群: 喜愛經營管理遊戲朋友、著迷懷舊建築風格人士。 後記: 製作團隊考察大量台灣歷史照片及影像,希望能忠實重塑台灣當年面貌給玩家,星爸感受到團隊滿滿的誠意與對台灣本土的熱愛。星爸心想澳門為中西文化匯粹之地,特色文化元素遍地皆是,如有熱心人士可否製作類似遊戲,以中葡風格建築、手信店鋪等為背照,或加入舞醉龍、賽車、巡遊等特色元素,除可為推廣玩家來澳門旅遊外,亦可在遊戲中推廣本地美食、特色手信及相關優惠,想起來也是挺不錯的,星爸很期待這一天的到來。 IOS連結 httpsitunes.apple.comappid1345776363 Android連結 httpsplay.google.comstoreappsdetailshellip; 喜歡本文請不忘點讚及分享,或到星爸爸茶座閱讀更多文章,亦歡迎到Facebook交流指正,謝謝閱讀。

【全城舞台.處處藝術| 2025澳門藝穗節玩轉社區】
文化創意
Cheers!・2025-09-05

由澳門文化局主辦的第二十屆澳門藝穗節,讓藝術走出傳統劇院,融入到大家日常生活嘅地方! 活動日期:2025年9月5日 ndash; 9月28日 特色亮點: 跳出劇院!走進造船廠、花園、茶館,沉浸式體驗藝術~ 全城舞台.全民藝術」精神,任何人都可以係觀眾甚至藝術家! 18個以上的演出節目 13項工作坊及展覽,玩足成個月! 重點推薦節目: 《逃‧迷途》數位劇場(鄺華歡創作) 《同謀共玩小丑藝術節》(陳麗妮策劃,好玩到笑爆嘴!) 國際團隊:日本Co.Scoopp、英國聲音藝術家Ray Lee 本地作品:《蘭桂樓》《獨腳宴》講述澳門家族故事 同場加映:涼茶工作坊、雜技親子班、快閃演出~啱晒一家大細嚟玩! 【精選9大必睇節目】 1. 《周記》mdash;mdash; 提線木偶times;母子對話・穿越時空的茶館回憶 新生代偶師蔡佳捷用泉州提線木偶,以獨腳戲上演一場跨時空的母子對話,從茶、飲酒線技藝與家庭關係出發,思考傳統文化於當代社會的傳承問題。 地點:澳門茶文化館(盧廉若公園內入口) 日期:9月5ndash;6日 2030 票價:MOP 120 2.《低人工夢工廠》mdash;mdash; 沉浸式互動體驗times;社會諷刺,您評分,決定「工人」命運! 參加者化身「評審員」,拎住遊戲幣遊走商場,試玩各種「自助機器」並評分!投放金幣解鎖劇情:例如操控演員模仿您的動作、沖咖啡比您飲,演員突然走出機器,不合資格不受歡迎便被淘汰。爆開背後辛酸故事:欠薪、工時長、夢想幻滅hellip;hellip;超揪心!帶您反思科技與人性的碰撞,消費背後的工人尊嚴到底去哪?演出最後甚至會收到當天被解雇的工人資料,衝擊力MAX! 地點:葡京人 H853 Fun Factory 日期:9月6ndash;7日(1430/1600/1900/2030 多場次) 票價:MOP 80 3. 《溫蒂與夢幻島》mdash;mdash; 重拾童年魔法・夢幻島呼喚您歸隊! 「身體摺細一點、站高一點、旋轉再快一點,我就能回到夢幻島!」 長大後就失去了魔法?童心遺失了?在荔枝碗船廠呢個奇幻空間,同溫蒂一齊找回相信童話的勇氣~ 地點:荔枝碗船廠片區 日期:9月6ndash;7日(1500/1700) 票價:MOP 80 4. 《蘭桂樓》mdash;mdash; 澳門「賣豬仔」血淚史・音樂說書穿透人心 賣出血和肉,將心臟換成鐵石與黃金hellip;hellip;澳門曾經作為苦力貿易中心嘅黑暗歷史首次以音樂說書形式呈現!一個有關「賣豬仔」的故事,為謀生而離鄉的鄭海,遭騙成為「豬仔」被賣到古巴,卻陰差陽錯當上了異地「豬仔館」的負責人。從被賣者變成賣家,這段經歷讓他烙下永不磨滅的傷痕。 地點:原咖啡(馬忌士圍5號) 日期:9月6ndash;7日 1500/1700;9月8ndash;9日 2000 票價:MOP 80 5. 《奶娃我謝謝謝謝妳》mdash;mdash; 媽媽們嘅深夜咖啡,探討生育自由與社會對「完美母親」的審判 談論生育時,我們是否失去了說「不」的自由? 凌晨三點,哺乳後的疲憊凝聚咖啡杯沿,成為唯一傾訴對象。沉浸式戲劇,帶您穿梭過去現在未來三個自己,每位媽媽都將在咖啡蒸氣中看見自己的影子。 假如有重新選擇機會,您想「重啟人生」定「選擇當下」? 地點:Bookand. 鵝眉街晉逸居地下4B 日期:9月16ndash;17日、19日 2030 票價:MOP 120 6. 《涼茶文化發展協會》mdash;mdash; 傳統涼茶VS現代癮疾・幫您「清熱解毒」踢走陋習! 涼茶檔新生代掌茶人創新研發「萬能涼茶」,助您戒癮解毒、重拾健康人生~ 涼茶能否與現代都市人成癮的「七宗罪」抗衡?它會在歷史舞台慢慢褪去,還是以創意殺出血路? 集合地點:爐石塘巷16號13 日期:9月19ndash;20日(1830/1945/2100) 票價:MOP 80 7. 《獨腳宴》mdash;mdash; 舊式茶樓團年飯・幽默感傷中反思「相聚」意義 當餐桌空出座位,團年飯該如何保溫? 觀眾坐在茶樓圓桌前,彷彿參與一場真實的家族聚會,在飲茶品點心的同時, 演員以獨腳戲形式帶領觀眾重溫團年飯的溫馨與感慨,映照當代家庭面臨不婚主義、少子化與移居潮的轉變,在笑聲與沉默中反思「相聚」的意義。 地點:大龍鳳茶樓(十月初五日街127號) 日期:9月19ndash;20日 2000 票價:MOP 80 8. 《聲BALL大集結》mdash;mdash; 跟著「有情緒」金屬球・穿梭街巷聽聲探秘! 英國聲音藝術家Ray Lee創作,結合環境、音樂與科技的互動體驗~ 用金屬球的聲音表達情緒・伴您悠遊地穿梭熟悉或陌生的街角小徑,最終所有波仔相遇・共同譜出一曲齊鳴共振的音樂。 日期:9月20ndash;21日(1100/1600) 地點:待定 票價:MOP 80 9.《卜面游弋》mdash;mdash; AR擴增實境・潛入內港碼頭異夢幻境! 「卜面」(船家甲板)變身幻夢舞台~透過AR技術融合記憶與異想,您將看到已消失的海上燈塔、懸浮在空中的漁網等超現實景象,彷彿穿越時空,體驗碼頭不同時期的歷史層次。 日期:9月26ndash;28日(13 00/13 30/14 00/14 30/15 00/15 30/16 00/16 30) 集合地點:內港北舢舨碼頭 票價:MOP 50 每個節目都極具創意同互動性,無論你係文青、家庭客,定係鍾意玩實驗藝術,總有一個啱你! 活動詳情:httpswww.macaucityfringe.gov.mo2025cn 購票詳情:httpsticketing.enjoymacao.moprogrammeP660166

Docker 101 - 為何要做成Docker (Container - 容器化)
科技新知
MacauYeah・2025-07-21

筆者更新了之前的Docker入門筆記(httpsgithub.commacauyeahVMDockerNotesblobmainDockerConcept101CN.md),順便補充了一些內容。如果各位讀者還在糾結要不要進行容器化,可以看看這些特性有沒有讓你心動。 Container 容器化的便利 1. 做到隔離效果 傳統上,同一機器安裝不同的 lib dependency ,可能出現衝突。在 docker 的環境下,不同 container 之間可以隔離開,除了是網路之間出現引用關係的衝突外,動態庫的衝突就沒有見過。一般處理好 Persistent Volume 的考量,單機下是沒有什麼問題的。 2. 遷移的過程比較簡單 傳統上,要把程式從一台機器搬到另一台機器,要預先安裝好相關的 lib dependency 。但使用 docker container 後,只要 docker 版本相容就好。docker image 本身,就已包括所有的 lib dependency 。另一個常見的傳統問題,就是 Linux 檔案的擁有權問題,特殊情況下,新機同一個 user 的 ID 編號也不一樣,可能要手動恢復權限。如果是 container 的 bind mount 檔案,只要使用 tar command (`tar sameowner xvf file.tar`)保留權限解壓就好。 3. 垂直水平擴容 因為有隔離及遷移方便的優勢,原本的機器達到上限,可以隨時換到其他機器上,修改對應的用戶入口就可以了(或更改DNS,可以更無縫連接)。一台機器不夠,亦可以多台機器一起來。即使不使用 docker swarm k8s 方案,有傳統的 proxy gateway 再加單機的 docker ,就可以做到分流的效果。 當然使用 docker swarm k8s 才是正解,可以更簡化 proxy gateway 的設定。而傳統的分佈式問題,例如 Share Storage 等,其實就沒有簡化到,但也沒有增加難度。所以大家若考慮擴容的問題,更適合考慮使用 Container 的方案。 筆者總結這兩三年來的使用經驗,只要大家一直有用開Linux,其實單機容器化不太難,頂多就是配置外置Persistent Volume Share Storage會帶來不習慣。而大家也可以想,Storage 這問題,是隨時隨地佈署應用程式的不可或缺的思考方式。Docker 沒有帶來更多的麻煩,而是帶來更多標準化的應用,例如傳統的NAS NFS,也是這個Storage問題的其中一個解法。

手機遊戲情報 | 2021/11/15-11/21
手機‧電玩
MacauYeah・2021-11-22

之前筆者因為參加一些主機遊戲Speedrun的節目,停更了手機遊戲情報一個月。現在將會回到原本的步伐,為大家搜羅每週值得關注的手機遊戲資訊。 跨跨跨平台遊戲 近年MMORPG不僅沒有因為行動平台的侵佔而被淘汰,很多廠商還很積極地做跨PC、手機平台的大型MMORPG。《奧丁:神叛》就是其中一款努力做這個嘗試的作品。《奧丁:神叛》是用 Unreal Engine 4 引擎開發,看著宣方的預告版,真的很有家用主機作品的AAA大作精美畫面水平。 官方中文網站:httpstwodin.kakaogames.com 遊戲暫時未有試玩,預計2022年上市。雖然未上市,但遊戲已經在韓國遊戲大獎橫掃四大獎項,為本屆遊戲展最大贏家。 傭兵物語:軍團戰略 接下來介紹的,同為韓國廠商的2D風格遊戲《傭兵物語:軍團戰略》。與Unreal當然無得比,但這遊戲著重RPG的排兵佈陣策略體驗。玩家可以通過收集不同種族的傭兵團來攻略故事,體驗人海戰術的樂趣。 未有下載的朋友,不妨先來看看不同YouTuber的攻略試玩,感受一下人海戰的感覺 遊戲已於11月15日正式開放下載啦 iOShttpsapps.apple.commoappid1573550944Android httpsplay.google.comstoreappsdetailsid=com.playside.fq 燒腦視錯覺解謎籠中窺夢 打打殺殺的遊戲,可能玩多了也會悶。如果厭惡了動作遊戲,不妨來試試看解迷類型。《籠中窺夢》是一款「視錯覺」解謎遊戲,由兩人工作室Optillusion開發完成。遊戲的內容全部包含在一個神秘的立方體中,立方體的每個面都是一個獨立的世界:工廠,燈塔,遊樂園,教堂等等,他們之間看似毫不相關,實則交錯萬千,充滿了意想不到的關聯。 遊戲以買斷制的方式發售,售價約為3.99USD iOShttpsapps.apple.commoappid1587860402Android httpsplay.google.comstoreappsdetailsid=com.Optillusion.Moncage