Dockerfile ENV和ARG的區別與應用

ARG

在Dockerfile中使用,

僅在build docker image的過程中(包括CMD和ENTRYPOINT)有效,在image被建立和container啟動之後,無效

如果你在Dockerfile中使用了ARG但並未給定初始值,則在執行docker build的時候未指定該ARG變數,則會失敗。

雖然其在container啟動後不再生效,但是使用‘docker history’可以檢視到。所以,敏感資料不建議使用ARG。

設定ARG和使用ARG編譯image, 例項如下:

# In the DockerfileARG some_variable_name# or with a hard-coded default:#ARG some_variable_name=default_valueRUN echo “Oh dang look at that $some_variable_name”# In the shell commanddocker build ——build-arg some_variable_name=a_value# Then you will getOh dang look at that a_value

ENV

在Dockerfile中使用,

在build docker imag的過程中有效,在image被建立和container啟動後作為環境變數依舊也有效,並且可以重寫覆蓋。

printenv可檢視其值。

設定ENV和使用env,例項如下

# no default valueENV hey# a default valueENV foo /bar# or ENV foo=/bar# ENV values can be used during the buildADD 。 $foo# or ADD 。 ${foo}# translates to: ADD 。 /bar# Use the following docker commands to set envdocker run -e “env_var_name=another_value” alpine envdocker run -e env_var_name alpine envdocker run ——env-file=env_file_name alpine env

有時候,ARG和ENV一起使用,例項如下圖:

# expect a build-time variableARG A_VARIABLE# use the value to set the ENV var defaultENV an_env_var=$A_VARIABLE# if not overridden, that value of an_env_var will be available to your containers!