2018年2月21日 星期三

What is difference ARG and ENV in Dockerfile

LAB 1:

  • Dockerfile
請注意,這邊用的是 ENV PHPVERSION 5
FROM alpine:latest
LABEL description="This example Dockerfile installs Apache & PHP."
ENV PHPVERSION 5
RUN apk add --update apache2 php${PHPVERSION}-apache2 php${PHPVERSION} && \
    rm -rf /var/cache/apk/* && \
    mkdir /run/apache2/ && \
    rm -rf /var/www/localhost/htdocs/index.html && \
    echo "" > /var/www/localhost/htdocs/index.php && \
    chmod 755 /var/www/localhost/htdocs/index.php
EXPOSE 80/tcp
ENTRYPOINT ["httpd"]
CMD ["-D", "FOREGROUND"]
接著我們把它給 build 成 docker image
# docker build --tag local/apache-php:5 .
再來我們來做個實驗,在 docker run 時,使用 --env "PHPVERSION=7" 會不會跑成 PHP7
# docker container run --env "PHPVERSION=7" -p 8080:80 --name apache-php7 local/apache-php:5
請先確認 docker container 的狀態為 Up 即可
# docker container list
請打開 Browser 輸入 http://IP-ADDRESS:8080,確認 PHP INFO

接著我們在進入到 docker container 裡面去確認 PHPVERSION 這個變數有沒有改變,請另開一個 terminal 來執行
# docker exec -it apache-php7 env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=8ab899f69969
TERM=xterm
PHPVERSION=7
HOME=/root
唔!很明顯有 PHPVERSION=7 ,但為什麼網頁上的 PHP VERSION 卻還是 5 哩!
這是因為在 docker build 的時候,已經先指定好版本了,並且已經製作出 docker image 了,所以沒辦法去變更 PHPVERSION=5
LAB 2:
  • Dockerfile
請注意,這邊預設用的是 ARG buildtime_PHPVERSION=5
FROM alpine:latest
LABEL description="This example Dockerfile installs Apache & PHP."
ARG buildtime_PHPVERSION=5
ENV env_var_name=$buildtime_PHPVERSION
RUN apk add --update apache2 php${buildtime_PHPVERSION}-apache2 php${buildtime_PHPVERSION} && \
    rm -rf /var/cache/apk/* && \
    mkdir /run/apache2/ && \
    rm -rf /var/www/localhost/htdocs/index.html && \
    echo "" > /var/www/localhost/htdocs/index.php && \
    chmod 755 /var/www/localhost/htdocs/index.php
EXPOSE 80/tcp
ENTRYPOINT ["httpd"]
CMD ["-D", "FOREGROUND"]
接著我們把它給 build 成 docker image,並命名為 local/apache-php:5
# docker build --tag local/apache-php:5 .
使用 --build-arg 這個參數,再 build 一個 docker image,並命名為 local/apache-php:7
# docker build --build-arg buildtime_PHPVERSION=7 --tag local/apache-php:7 .
請觀察 docker images
# docker images
請同時啟動 local/apache-php:5 & local/apache-php:7,並觀察兩個 docker container 的 PHP VERSION
# docker container run -d -p 9090:80 --name apache-php5 local/apache-php:5
# docker container run -d -p 8080:80 --name apache-php7 local/apache-php:7
請確認 docker container 狀態為 UP
# docker container list
CONTAINER ID        IMAGE                COMMAND                 CREATED             STATUS              PORTS                  NAMES
278b3a6d165b        local/apache-php:5   "httpd -D FOREGROUND"   11 minutes ago      Up 11 minutes       0.0.0.0:9090->80/tcp   apache-php5
4f57218453c9        local/apache-php:7   "httpd -D FOREGROUND"   12 minutes ago      Up 12 minutes       0.0.0.0:8080->80/tcp   apache-php7
請打開 Browser 分別輸入 http://IP-ADDRESS:8080 & http://IP-ADDRESS:9090



明顯可以看出,有不同的 PHP VERSION
接著分別確認一下,這二個 docker container 的 ENV 是什麼
# docker exec -it apache-php7 env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=4f57218453c9
TERM=xterm
env_var_name=7
HOME=/root
# docker exec -it apache-php5 env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=278b3a6d165b
TERM=xterm
env_var_name=5
HOME=/root

詳細原因可以參考下面這張圖



Reference:

沒有留言:

張貼留言