Skip to content

ENV and ARG

ENV

Якщо в додатку є якісь змінні середовища то у контейнер під час запуску їх можна передавати ключем -e:

docker build . -t web-server:1.1-env
docker run -p 8080:8080 -e APP_ENV=Production web-server:1.1-env

Додатки можуть ці змінні десь у коді використовувати, наприклад:

from flask import Flask, Response, send_file
import os

app = Flask(__name__)

# Access the environment variable appEnv = os.environ.get("APP_ENV", "Development")
appEnv = os.environ.get("APP_ENV", "Development") #"Development" - default value if APP_ENV is empty

@app.route('/')
def hello():

    return "Docker is Awesome! My APP_ENV is {appEnv}"  

@app.route('/logo')
def docker_logo():
    return send_file('docker-logo.png', mimetype='image/png')

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080)

ARG

Інструкція ARG подібна до ENV, але доступна тільки під час білду Image і доступна тільки в контексті Dockerfile. Сам додаток не знає про значення ARG, як і сам контейнер.

ARG PYTHIN_VERSION=3.14

FROM python:{$PYTHIN_VERSION}.0a3-alpine3.21


WORKDIR /app
COPY app.py .
COPY docker-logo.png .
COPY requirements.txt .
RUN pip install -r requirements.txt
EXPOSE 8080
ENTRYPOINT ["python", "app.py"]

Як ARG застосовують на практиці? Наприклад, наш додаток має працювати на різних версіях Python, і нам потрібно розповсюджувати його вже з Images на базі різних версій Python. Ми можемо збілдити той самий Dockerfile з різними версіями базового Python Image наступним чином:

docker build --build-arg PYTHON_VERSION=3.8 . -t web-server:1.0

Підсумуємо:

  • ENV використовується для передачі конфігурацій в середину самого додатку. Наприклад, URL для бази даних або значення зовнішнього API.
  • ARG використовується для проставлення якогось змінного значення, потрібного всередині самого Dockerfile. ARG можна використовувати в інших інструкціях Dockerfile, наприклад, RUN. Також можна перевизначити ENV наступним чином:
ARG MY_ARG=default
ENV APP_ENV=$MY_ARG