簡體   English   中英

如何使用 env 文件構建 Docker

[英]How to build Docker with env file

我在 docker build 期間遇到了 env 文件。

我正在嘗試為我的 ruby 項目構建 docker 鏡像,該項目出於多種原因使用環境變量。 原因之一是檢查數據庫是否可用(使用ActiveRecord::Base.connection ),並基於此創建/更新包含一些主數據的數據庫。

我可以在 docker 運行期間通過docker run --env-file='.env'命令使用 env 文件。

但我想在我的 docker 構建過程中使用這些 ENV 變量。

誰能幫我解決這種情況?

您還可以使用--build-arg設置構建環境變量。 文檔示例

如您所見,它相當於docker run --env ,沒有--env-file

如果您使用的是 docker-compose(現在與 Docker 捆綁在一起),則 .env是包含變量的文件的默認文件名,這些變量僅供docker-compose.yml文件的解析器使用,而不是構建進程或容器環境變量。

使用--env-file命令行參數或在 docker -compose.yml文件中設置env_file變量將識別從哪個文件將變量加載到容器環境(而不是構建過程)中。 您可以從正在運行的容器中的 shell 運行set以查看已加載的環境變量。

在 docker -compose.yml中設置env_file=.env是一種常見的反模式,這是一件非常令人困惑的事情,因為它使.env文件為 docker -compose.yml解析器和正在運行的容器環境提供了兩個變量 - 它幾乎可以肯定是您閱讀本文的原因。

如果您希望.env中的變量可用於構建過程,即您想在Dockerfile中使用它們,那么您需要在docker-compose.yml中顯式設置它們並且您需要在頂部加載它們你的Dockerfile 此示例顯示在.env 、 docker -compose.ymlDockerfile中使用的語法:

# This excerpt is from .env
# ...
# The quotes here are important if you have any special 
# characters and want them to work on mac, pc and linux:
ARG_1="value of first argument"
ARG_2="value of second argument"
ARG_3="value of third argument"
# ...
# This excerpt is from docker-compose.yml
# ...
# env_file (.env.staging) is loaded in the container at runtime:
    env_file:
      - .env.staging
# ...
    build:
      context: ./
      dockerfile: docker/app/Dockerfile
# The following will let you use ${ARG_x} during your build in docker/app/Dockerfile
      args:
        ARG_1: ${ARG_1}
        ARG_2: ${ARG_2}
        ARG_3: ${ARG_3}
# ...
# This excerpt is from /docker/app/Dockerfile
FROM somerepo/someimage:ver as something
# Import variables from docker-compose.yml:
ARG ARG_1=$ARG_1
ARG ARG_2=$ARG_2
ARG ARG_3=$ARG_3
# ...
# Now you can use ${ARG_1}, ${ARG_2} etc to reference values from your .env file
# ...

我有一個案例,我需要一個 sed 命令中的變量。 我使用了以下內容:

RUN source config.env; sed -i -r "s/^url=.*/url=${MONGODB_SERVER}/" /app/module/module.ini

變量可用性僅限於該特定命令,但這對我來說已經足夠了。

我有同樣的問題,老實說--build-arg當你有很多變量時並不是最佳的。 相反,您可以為它們設置一個循環:

docker build -f Dockerfile -t IMAGE:TAG $(for i in `cat .env`; do out+="--build-arg $i " ; done; echo $out;out="") .

我從其他人那里讀到的是沒有“docker build --env-file ....”選項/設備。 因此,這種情況為將 dockerfile 的更多內容轉移到 dockerfile 簡單復制和運行的 shell 腳本提供了一個很好的論據,因為您可以通過這種方式獲取 .env 文件。

您還可以在使用 --build-arg 標志運行構建之前獲取 .env 文件。 我在下面展示了兩種方式的組合。

問候.sh

#!/bin/sh
echo Hello $myTestVar

source variables.env
echo Foo $copyFileTest

變量.env

export myTestVariable="World"
export copyFileTest="Bar"

命令行參數

source variables.env
docker build --no-cache -t variabletest:0.01 --build-arg myTestVarArg=$myTestVariable .

文件

FROM alpine:latest

ARG myTestVarArg
ENV myTestVar $myTestVarArg    #takes the command line argument and makes it an env var

COPY variables.env .
RUN source variables.env && echo Foo $copyFileTest  #outputs Foo Bar
COPY greetings.sh .
RUN chmod +x /greetings.sh
RUN /greetings.sh               #outputs:  Hello World  and  Foo Bar

RUN echo $copyFileTest          #does not work, outputs nothing

RUN rm variables.env

您可以在 Dockerfile 中添加ENV myvariable myvalue 檢查泊塢窗文檔。

暫無
暫無

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

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