為課程開始準備的播客轉錄翻譯
Docker Compose 是一個令人驚嘆的工具,用於建立工作
應用程式中使用的堆疊環境。它允許您定義
應用程式的每個組件都遵循清晰簡單的語法
文件
隨著
簇
但這是否意味著您可以在中使用相同的 docker-compose 文件
開發過程和生產環境?或使用相同的文件
分期?嗯,一般來說,是的,但是對於此功能,我們需要以下內容:
- 變數內插:使用環境變數進行某些
每個環境都會改變的價值觀。 - 配置覆蓋:能夠定義第二個(或任何
另一個後續的)docker-compose 檔案將更改相關的內容
首先,docker compose 將負責合併兩個檔案。
開發文件和生產文件之間的差異
在開發過程中,您很可能想要檢查程式碼更改
即時的。為此,通常將包含原始程式碼的磁碟區安裝在
包含應用程式運行時的容器。但對於生產環境
這種方法不適合。
在生產中,您有一個包含許多節點的集群,並且卷是本地的
相對於容器(或服務)運行的節點,因此您不需要
您可以掛載原始碼,無需複雜的操作,包括
程式碼同步、訊號等
相反,我們通常希望使用特定版本的程式碼來建立圖像。
習慣上用適當的標籤來標記它(您可以使用語義
版本控製或其他系統由您自行決定)。
配置覆蓋
鑑於差異以及您的依賴關係在場景中可能有所不同
開發和生產,很明顯我們將需要不同的配置。
Docker compose 支援將不同的 compose 檔案合併到
獲得最終配置。從範例中可以看出其工作原理:
$ cat docker-compose.yml
version: "3.2"
services:
whale:
image: docker/whalesay
command: ["cowsay", "hello!"]
$ docker-compose up
Creating network "composeconfigs_default" with the default driver
Starting composeconfigs_whale_1
Attaching to composeconfigs_whale_1
whale_1 | ________
whale_1 | < hello! >
whale_1 | --------
whale_1 |
whale_1 |
whale_1 |
whale_1 | ## .
whale_1 | ## ## ## ==
whale_1 | ## ## ## ## ===
whale_1 | /""""""""""""""""___/ ===
whale_1 | ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~
whale_1 | ______ o __/
whale_1 | __/
whale_1 | __________/
composeconfigs_whale_1 exited with code 0
如前所述,docker compose 支援組合多個 compose -
文件,這允許您覆蓋第二個文件中的各種參數。例如:
$ cat docker-compose.second.yml
version: "3.2"
services:
whale:
command: ["cowsay", "bye!"]
$ docker-compose -f docker-compose.yml -f docker-compose.second.yml up
Creating composeconfigs_whale_1
Attaching to composeconfigs_whale_1
whale_1 | ______
whale_1 | < bye! >
whale_1 | ------
whale_1 |
whale_1 |
whale_1 |
whale_1 | ## .
whale_1 | ## ## ## ==
whale_1 | ## ## ## ## ===
whale_1 | /""""""""""""""""___/ ===
whale_1 | ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~
whale_1 | ______ o __/
whale_1 | __/
whale_1 | __________/
composeconfigs_whale_1 exited with code 0
這種語法在開發過程中不太方便,當指令
需要進行多次。
幸運的是,docker compose 會自動尋找一個名為的特殊文件
docker-compose.override.yml 覆蓋值 泊塢窗,compose.yml。 如果
重新命名第二個文件,只需使用原始命令即可得到相同的結果:
$ mv docker-compose.second.yml docker-compose.override.yml
$ docker-compose up
Starting composeconfigs_whale_1
Attaching to composeconfigs_whale_1
whale_1 | ______
whale_1 | < bye! >
whale_1 | ------
whale_1 |
whale_1 |
whale_1 |
whale_1 | ## .
whale_1 | ## ## ## ==
whale_1 | ## ## ## ## ===
whale_1 | /""""""""""""""""___/ ===
whale_1 | ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~
whale_1 | ______ o __/
whale_1 | __/
whale_1 | __________/
composeconfigs_whale_1 exited with code 0
好吧,這樣比較容易記。
變數插值
設定檔支援
變數
services:
my-service:
build:
context: .
image: private.registry.mine/my-stack/my-service:${MY_SERVICE_VERSION:-latest}
...
如果你這樣做 docker-compose 建置(或推播) 沒有環境變數
$MY_SERVICE_VERSION,該值將被使用 最新但如果你設定
建構前環境變數的值,建置或推送時將使用該值
到登記處 私有.registry.mine.
我的原則
對我有用的方法也可能對你有用。我遵循這些
簡單的規則:
- 我所有用於生產、開發(或其他環境)的堆疊都是透過定義的
docker-compose 文件 - 設定檔需要盡可能覆蓋我的所有環境
避免重複。 - 我需要一個簡單的命令來在每種環境中工作。
- 主要配置在檔案中定義 泊塢窗,compose.yml.
- 環境變數用於定義影像標籤或其他
變數可能因環境而異(暫存、整合、
生產)。 - 生產變數的值用作
預設情況下,如果堆疊在生產環境中啟動而無需
設定環境變數。 - 若要在生產環境中啟動服務,請使用指令 docker stack 部署 - compose-file docker-compose.yml -with-registry-auth my-stack-name.
- 使用指令啟動工作環境 docker-compose up -d.
讓我們來看一個簡單的例子。
# docker-compose.yml
...
services:
my-service:
build:
context: .
image: private.registry.mine/my-stack/my-service:${MY_SERVICE_VERSION:-latest}
environment:
API_ENDPOINT: ${API_ENDPOINT:-https://production.my-api.com}
...
И
# docker-compose.override.yml
...
services:
my-service:
ports: # This is needed for development!
- 80:80
environment:
API_ENDPOINT: https://devel.my-api.com
volumes:
- ./:/project/src
...
我可以用 docker-compose(docker-compose up)運行堆疊
原始碼掛載的開發模式 /項目/src.
我可以在生產中使用這些相同的文件!我絕對可以使用
相同的文件 泊塢窗,compose.yml 用於演出。將此擴展為
生產,我只需要構建並發送帶有預定義標籤的圖像
CI階段:
export MY_SERVICE_VERSION=1.2.3
docker-compose -f docker-compose.yml build
docker-compose -f docker-compose.yml push
在生產中,可以使用以下命令運行:
export MY_SERVICE_VERSION=1.2.3
docker stack deploy my-stack --compose-file docker-compose.yml --with-registry-auth
如果你想在舞台上做同樣的事情,你只需要定義
在臨時環境中工作所需的環境變數:
export MY_SERVICE_VERSION=1.2.3
export API_ENDPOINT=http://staging.my-api.com
docker stack deploy my-stack --compose-file docker-compose.yml --with-registry-auth
結果,我們使用了兩個不同的 docker-compose 文件,其中沒有
重複配置可用於您擁有的任何環境!
了解有關課程的更多信息
來源: www.habr.com