由於專案採用的是映象以host網路模式部署,預設暴露埠是80,顯然80埠很容易被占用,即便 預設暴露乙個不容易被占用的埠也不是最終辦法,限制了映象拿到任意機器上部署,因此我們需要在容器啟動的時候指定想要暴露的埠。
解決思路很簡單,就是通過 docker run 的時候將想要暴露的埠傳遞進容器,然後修改nginx預設監聽埠。傳遞方式有一下兩種。
方式二:在 docker run 的最後追加引數,容器內部去獲取該引數,並處理。(eg:docker run -it --name mynginx -d nginx expose_port=***),採用這種方式的話,dockerfile中必須用 entrypoint 。
我們採用的方式一,通過 docker run -e exposeport=*** 就可以將自定義埠傳遞進去,通過指令碼替換掉nginc.conf中監聽的埠。dockerfile 檔案新增一下內容即可。
# 設定環境變數 exposeport 預設值為 88,後面可以通過docker run -e exposeport="***"修改,這個環境變數在容器裡也可以$exposeport獲取
env exposeport 88
# 暫定預設88
expose $exposeport
# 不能用這種形式,否則讀取不到環境變數
entrypoint sh /root/image_run.sh $exposeport
這裡需要注意的點就是 entrypoint 後面不可以跟[「sh」, 「/root/image_run.sh」, $exposeport] ,因為這種模式就不會是 shell 方式了,讀不到變數的值。
下面在記錄一下 dockerfile 中 expose 暴露埠的作用:
結論:
dockerfile 中的 expose用處不大!主要是為了規範,方便其他人員理解。
原因:
expose 的官方用途:
在dockerfile中宣告了哪些埠是將要開放的。
在構建容器時通過 -p (大寫的p)可以隨機對映埠。(如果expose沒有指定埠,那麼使用 -p 引數無效)
為什麼說它用不不大呢?
真正的暴露埠是在建立容器 run 的時候指定的 -p 或者 -p 引數,先來說說 -p 引數後面跟的是【主機埠:容器埠】,既然在執行的時候還需要指定埠那麼 expose還有什麼用呢!
當我們建立容器 run 的時候指定引數是 -p,那麼在執行之後 會把 expose 的埠隨機對映到主機的不同埠,既然對映到不同的埠那麼容器的埠就是是隨機的不確定的,那就要在執行之後才能知道埠,這樣使用起來是極其不便的。
ServerVariables集合環境變數列表
語法 request.servervariables server environment variable 引數伺服器環境變數,指定要檢索的伺服器環境變數名。可以使用下面列出的值 變數說明path info轉換後的版本,該變數獲取路徑並進行必要的由虛擬至物理的對映。query string查詢ht...
時間在變,環境在變,我們的思想在變嗎
從前,有兩個飢餓的人得到了一位長者的恩賜 一根魚竿和一簍鮮活碩大的魚。其中,乙個人要了一簍魚,另乙個人要了一根魚竿,於是他們分道揚鑣了。得到魚的人原地就用乾柴搭起篝火煮起了魚,他狼吞虎嚥,還沒有品出鮮魚的肉香,轉瞬間,連魚帶湯就被他吃了個精光,不久,他便餓死在空空的魚簍旁。另乙個人則提著魚竿繼續忍飢...
macOS配置Android SDK 環境變數
1 啟動終端,可以在spotlight中搜尋 終端 2 進入當前使用者的home目錄 cd home3 建立 bash profile 檔案 當該檔案不存在時 如果檔案已存在,直接開啟檔案即可 touch bash profile4 開啟.bash profile檔案,對其內容進行編輯 open e...