🐳 ИспользованиС if-else в Dockerfile

Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π² Docker

by itisgood

Docker – это ваТнСйший инструмСнт для ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π΄Π΅Π»Π°ΡŽΡ‰ΠΈΠΉ ΠΈΡ… пСрСносимыми ΠΈ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ.

Dockerfile – ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ экосистСмы Docker, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ ΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.

Часто Π² Dockerfile Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π² условной Π»ΠΎΠ³ΠΈΠΊΠ΅, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Ρ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΊ это дСлаСтся Π² сцСнариях программирования.

Однако синтаксис Dockerfile Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ условия if-else.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ рассмотрим, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ эффСктивно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΡΠ»ΠΎΠ²Π½ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ Π² Dockerfiles, особСнно с внСшними Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ.

1. ΠžΡΠ½ΠΎΠ²Ρ‹: ARG ΠΈ ENV

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΠΎΠ³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒΡΡ Π² ΡƒΡΠ»ΠΎΠ²Π½ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ основы.

  • ARG: Π­Ρ‚Π° инструкция опрСдСляСт ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ сборщику Π²ΠΎ врСмя сборки с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ docker build. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ARG ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ доступно Π²ΠΎ врСмя сборки Docker, Π½ΠΎ Π½Π΅ послС сборки ΠΎΠ±Ρ€Π°Π·Π°.
  • ENV: Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π·Π°Π΄Π°Π΅Ρ‚ ΠΏΠΎΡΡ‚ΠΎΡΠ½Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ окруТСния для ΠΎΠ±Ρ€Π°Π·Π°. Доступ ΠΊ Π½Π΅ΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ Π²ΠΎ врСмя сборки ΠΈ ΠΏΡ€ΠΈ запускС ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΈΠ· собранного ΠΎΠ±Ρ€Π°Π·Π°.

2. ИспользованиС ΠΊΠΎΠΌΠ°Π½Π΄ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ для условной Π»ΠΎΠ³ΠΈΠΊΠΈ

ΠžΡΠ½ΠΎΠ²Π½Ρ‹ΠΌ способом Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ условной Π»ΠΎΠ³ΠΈΠΊΠΈ Π² Dockerfile являСтся Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ.

Для этого ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ RUN вмСстС с Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹ΠΌΠΈ shell-ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ.

Рассмотрим практичСский ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с использованиСм внСшнСго Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°.

Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ:

ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π»ΠΈΠ±ΠΎ nginx, Π»ΠΈΠ±ΠΎ apache2 Π½Π° основС внСшнСго Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° сборки.

Dockerfile:

# ИспользованиС Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±Ρ€Π°Π·Π° Ubuntu
FROM ubuntu:20.04

# Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ подсказок с apt
ENV DEBIAN_FRONTEND=noninteractive

# ОбъявлСниС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° для Π²Π΅Π±-сСрвСра
ARG WEBSERVER

# ИспользованиС Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ для опрСдСлСния сСрвСра для установки
RUN if [ "$WEBSERVER" = "nginx" ]; then \
        apt-get update && apt-get install -y nginx; \
    elif [ "$WEBSERVER" = "apache" ]; then \
        apt-get update && apt-get install -y apache2; \
    else \
        echo "No valid webserver specified"; \
    fi

# ΠžΡΡ‚Π°Π»ΡŒΠ½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ Dockerfile...

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π·Π° Docker:

Для сборки ΠΎΠ±Ρ€Π°Π·Π° ΠΈ указания Π²Π΅Π±-сСрвСра:

docker build --build-arg WEBSERVER=nginx -t myimage:latest . 

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π±ΡƒΠ΄Π΅Ρ‚ создан ΠΎΠ±Ρ€Π°Π· Docker с установлСнным nginx.

Для установки apache2 Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° WEBSERVER.

3. ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ ΠΈ сообраТСния

  • Π§ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ: Π₯отя использованиС ΠΊΠΎΠΌΠ°Π½Π΄ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ Π² инструкции RUN обСспСчиваСт Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ, ΠΎΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΡ…ΡƒΠ΄ΡˆΠΈΡ‚ΡŒ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ Docker-Ρ„Π°ΠΉΠ»Π°, Ссли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ слишком часто ΠΈΠ»ΠΈ Ссли Π»ΠΎΠ³ΠΈΠΊΠ° становится слишком слоТной.
  • Π‘Π»ΠΎΠΈ: КаТдая ΠΊΠΎΠΌΠ°Π½Π΄Π° RUN создаСт Π½ΠΎΠ²Ρ‹ΠΉ слой Π² ΠΎΠ±Ρ€Π°Π·Π΅ Docker. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΡŽ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΎΠ±Ρ€Π°Π·Π°. Для ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ этого эффСкта ΡΡ‚Π°Ρ€Π°ΠΉΡ‚Π΅ΡΡŒ ΠΏΠΎ возмоТности ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ &&.
  • ЗначСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: Если Π²Ρ‹ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚Π΅ ARG, Ρ‚ΠΎ Π²ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Π½ΠΈΠ΅ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎΠ³ΠΎ повСдСния рСкомСндуСтся ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. НапримСр: ARG WEBSERVER=nginx.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π₯отя Ρ„Π°ΠΉΠ»Ρ‹ Dockerfiles Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ встроСнныС структуры if-else, для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ условной Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π»ΠΎΠ²ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ shell-сцСнарии Π² инструкции RUN.

Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, ΠΏΡ€ΠΈ Ρ€Π°Π·ΡƒΠΌΠ½ΠΎΠΌ использовании, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈ создании ΠΎΠ±Ρ€Π°Π·ΠΎΠ² Docker, Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΊ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ потрСбностям ΠΈΠ»ΠΈ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΡŽ.

см. Ρ‚Π°ΠΊΠΆΠ΅:

 

You may also like

Leave a Comment