在寫Dockerfile時, ENV和ARG,包括.env都是很容易弄混的概念。讓我們對其進行區分。
.env文件
和docker-compose.yml配合使用。並不和Dockerfile一起使用
env_file
在Dockerfile中使用,當環境變量很多,可食用該參數,指定對應的變量文件。
ARG
在Dockerfile中使用,僅僅在build docker image的過程中(包括CMD和ENTRYPOINT)有效,在image被創建和container啟動之后,無效。
如果你在Dockerfile中使用了ARG但並未給定初始值,則在運行docker build的時候未指定該ARG變量,則會失敗。
雖然其在container啟動后不再生效,但是使用‘docker history’可以查看到。所以,敏感數據不建議使用ARG.
設置ARG和使用ARG編譯image, 實例如下:
-
# In the Dockerfile
-
ARG some_variable_name
-
# or with a hard-coded default:
-
#ARG some_variable_name=default_value
-
-
RUN echo "Oh dang look at that $some_variable_name"
-
-
# In the shell command
-
docker build --build-arg some_variable_name=a_value
-
-
# Then you will get
-
Oh dang look at that a_value
ENV
在Dockerfile中使用,在build docker imag的過程中有效,在image被創建和container啟動后作為環境變量依舊也有效,並且可以重寫覆蓋。printenv可查看其值。
設置ENV和使用env,實例如下
-
# no default value
-
ENV hey
-
# a default value
-
ENV foo /bar
-
# or ENV foo=/bar
-
-
# ENV values can be used during the build
-
ADD . $foo
-
# or ADD . ${foo}
-
# translates to: ADD . /bar
-
-
# Use the following docker commands to set env
-
-
docker run -e "env_var_name=another_value" alpine env
-
docker run -e env_var_name alpine env
-
docker run --env-file=env_file_name alpine env
有時候,ARG和ENV一起使用,實例如下圖:
-
# expect a build-time variable
-
ARG A_VARIABLE
-
# use the value to set the ENV var default
-
ENV an_env_var=$A_VARIABLE
-
# if not overridden, that value of an_env_var will be available to your containers!