如何將環境變量值傳遞到 Dockerfile
一、概述
環境變量是一種將應用程序配置外部化的便捷方式。因此,它們對於構建 Docker 容器也很有用。然而,在Dockerfile
中傳遞和使用它們並不像想像的那麼容易。
在這個簡短的教程中,我們將仔細研究如何將環境變量值傳遞給Dockerfile。
首先,我們將展示將環境變量傳遞給構建過程可能有用的可能用例.
然後,我們將解釋執行此操作的ARG
命令。最後,我們將看到一個工作示例。
2. Dockerfile
與 Container 中的環境變量
Dockerfile
是一個腳本,其中包含有關如何構建 Docker 映像的說明。另一方面, Docker 容器是鏡像的可運行實例。根據我們的需要,我們可能需要構建時或運行時環境變量。
我們只關注構建時定制,將環境變量傳遞到我們的Dockerfile
中以與 docker docker build
一起使用。
三、在Dockerfile
中使用環境變量的好處
使用環境變量的最大優勢是靈活性。我們可以只創建一個Dockerfile
,根據用於構建容器的環境進行不同的配置。作為說明,讓我們想像一個在開發環境中啟用調試選項並在生產環境中禁用相同選項的應用程序。使用環境變量,我們只需要創建一個Dockerfile
,它將保存調試標誌的環境變量傳遞給容器和其中的應用程序。
另一個重要的優勢是安全問題。將密碼或其他敏感信息直接存儲在Dockerfile
中可能不是最好的主意。環境變量有助於克服這個問題。
4. 示例配置
在我們了解如何將環境變量值傳遞到Dockerfile
,讓我們構建一個示例來測試它。
我們將創建一個名為greetings.sh
的簡單 bash 腳本,它使用環境變量將問候語打印到控制台:
#!/bin/sh
echo Hello $env_name
現在,讓我們在同一目錄中創建一個Dockerfile
:
FROM alpine:latest
COPY greetings.sh .
RUN chmod +x /greetings.sh
CMD ["/greetings.sh"]
它複製我們的腳本,使其可執行並運行它。讓我們構建圖像:
docker build -t baeldung_greetings .
然後,讓我們運行它:
docker run baeldung_greetings
我們應該在控制台中只看到一行:
Hello
5. 將環境變量傳遞到Dockerfile
Dockerfile
提供了一個專用的變量類型ENV
來創建環境變量。我們可以在構建期間以及容器運行後訪問 ENV 值。
讓我們看看如何使用它向我們的問候腳本傳遞值。有兩種不同的方法可以做到這一點。
5.1。硬編碼環境值
傳遞環境值的最簡單方法是在Dockerfile
中對其進行硬編碼。在某些情況下,這可能已經足夠好了。讓我們將John
硬編碼為 Dockerfile 中的默認名稱:
FROM alpine:latest
ENV env_name John
COPY greetings.sh .
RUN chmod +x /greetings.sh
CMD ["/greetings.sh"]
現在,讓我們構建並運行我們的鏡像。這是所需的控制台輸出:
Hello John
5.2.設置動態環境值
Dockerfile
不提供在構建過程中設置 ENV 值的動態工具。但是,有一個解決這個問題的方法。我們必須使用ARG
。 ARG 值的工作方式與 ENV 不同,因為**一旦構建了映像,我們就無法再訪問它們**。讓我們看看如何解決這個問題:
ARG name
ENV env_name $name
我們正在引入name
ARG
變量。之後,我們使用它為使用 ENV 的env_name
ENV
變量賦值。
當我們想要設置這個參數時,我們使用–build-arg
標誌傳遞它:
docker build -t baeldung_greetings --build-arg name=Baeldung .
現在,讓我們運行我們的容器。我們應該看到:
Hello Baeldung
如果我們想更改名稱怎麼辦?我們所要做的就是用不同的build-arg
值重建圖像。
六,結論
在本文中,我們學習瞭如何在構建Dockerfile
期間設置環境變量。
首先,我們看到了參數化Dockerfile
的優勢。然後,我們看到瞭如何使用ENV
命令設置環境變量以及如何使用ARG
允許在構建時修改該值。
與往常一樣,本文的完整源代碼可在 GitHub 上獲得。