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 наступним чином:
Підсумуємо:
- ENV використовується для передачі конфігурацій в середину самого додатку. Наприклад, URL для бази даних або значення зовнішнього API.
- ARG використовується для проставлення якогось змінного значення, потрібного всередині самого
Dockerfile. ARG можна використовувати в інших інструкціяхDockerfile, наприклад,RUN. Також можна перевизначити ENV наступним чином: