簡體   English   中英

Docker 秘密作為環境變量傳遞

[英]Docker secrets passing as environment variable

我將 docker 置於群模式並執行以下操作

echo "'admin'" | docker secret create password -
docker service create \
--network="host" \
--secret source=password,target=password \
-e PASSWORD='/run/secrets/password' \
<image>

我無法通過 docker 服務傳遞通過環境變量創建的密碼秘密。

請幫我找出我哪里出錯了。

您誤解了Docker機密的概念。 創建機密的全部目的是避免將敏感信息放入環境變量中。

在您的示例中, PASSWORD環境變量將只帶有值/run/secrets/password ,這是文件名而不是密碼admin

一個有效的docker機密案例是,您的docker-image從該文件讀取密碼。 這里簽出文檔尤其是關於MySQL的示例:

環境變量MYSQL_PASSWORD_FILE和MYSQL_ROOT_PASSWORD_FILE指向文件/ run / secrets / mysql_password和/ run / secrets / mysql_root_password。 首次初始化系統數據庫時,mysql映像將從這些文件中讀取密碼字符串。

簡而言之:您的Docker映像應讀取文件/run/secrets/password

這里沒有標准。

Docker 文檔不鼓勵使用環境變量,但存在混淆是將密碼直接設置為“環境”部分中的字符串還是容器內環境變量的其他用法。 當相同的值可能用於多個服務時,還需要在多個地方檢查和更改它而不是一個秘密值時使用字符串而不是秘密。

一些圖像,如 mariadb,使用帶有 _FILE 后綴的 env 變量來填充具有秘密文件內容的變量的無后綴版本。 這似乎沒問題。

使用 Docker 不應該僅僅為了支持文件中的機密而重新設計應用程序架構。 大多數其他編排工具,例如 Kubernetes,都支持將機密直接放入 env 變量中。 如今,它並不被認為是不好的做法。 Docker Swarm 只是缺乏將秘密傳遞給 env 變量的良好實踐和正確示例。

恕我直言,最好的方法是使用入口點作為“裝飾器”來從秘密准備環境。

正確的入口點腳本可以寫成幾乎通用的處理機密的方式,因為我們可以將原始圖像入口點作為參數傳遞給我們的新入口點腳本,因此在我們使用腳本准備容器后,原始圖像“裝飾器”正在做自己的工作。

我個人使用以下入口點和包含/bin/sh圖像: https : //github.com/DevilaN/docker-entrypoint-example

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM