Dockerfile 中的變數

Docker 入門

Tim Sangster

Software Engineer @ DataCamp

使用 ARG 指令設定變數

在 Dockerfile 中建立變數

ARG <var_name>=<var_value>

例如 ARG path=/home/repl

在 Dockerfile 中使用

$path

例如 COPY /local/path $path

Docker 入門

ARG 指令的使用情境

設定 Python 版本

FROM ubuntu
ARG python_version=3.9.7-1+bionic1
RUN apt-get install python3=$python_version
RUN apt-get install python3-dev=$python_version

設定資料夾

FROM ubuntu
ARG project_folder=/projects/pipeline_v3
COPY /local/project/files $project_folder
COPY /local/project/test_files $project_folder/tests
Docker 入門

在建置時設定 ARG 變數

FROM ubuntu
ARG project_folder=/projects/pipeline_v3
COPY /local/project/files $project_folder
COPY /local/project/test_files $project_folder/tests

在建置指令中設定變數

docker build --build-arg project_folder=/repl/pipeline .

ARG 會被覆寫,檔案將位於:

COPY /local/project/files /repl/pipeline
COPY /local/project/test_files /repl/pipeline/tests
Docker 入門

使用 ENV 設定變數

在 Dockerfile 中建立變數

ENV <var_name>=<var_value>

例如 ENV DB_USER=pipeline_user

在 Dockerfile 或執行時使用

$DB_USER

例如 CMD psql -U $DB_USER

Docker 入門

ENV 指令的使用情境

設定執行時使用的目錄

ENV DATA_DIR=/usr/local/var/postgres
ENV MODE production

在執行時設定或覆寫變數

docker run --env <key>=<value> <image-name>

docker run --env POSTGRES_USER=test_db --env POSTGRES_PASSWORD=test_db postgres

1 https://hub.docker.com/_/postgres
Docker 入門

變數中的機密不安全

docker history <image-name>

ARG DB_PASSWORD=example_password

會在 docker history 中顯示:

IMAGE          CREATED        CREATED BY                          SIZE      ...
cd338027297f   2 months ago   ARG DB_PASSWORD=example_password    0B        ...
Docker 入門

重點整理

用途 Dockerfile 指令
建立只在建置期間可用的變數 ARG <name>=<value>
建立變數 ENV <name>=<value>

用途 Shell 指令
在 docker build 覆寫 ARG docker build --build-arg <name>=<value>
在 docker run 覆寫 ENV docker run --env <name>=<value> <image-name>
檢視建立映像所用的指令 docker history <image-name>
Docker 入門

一起來練習吧!

Docker 入門

Preparing Video For Download...