🐳 Как ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ…ΡΡˆ ΠΊΠΎΠΌΠΌΠΈΡ‚Π° Π² Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠΌ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ Docker

Как ΡƒΠ·Π½Π°Ρ‚ΡŒ Ρ‚Π΅Π³ ΠΎΠ±Ρ€Π°Π·Π° с ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠΌ

by itisgood

1. ΠžΠ±Π·ΠΎΡ€

Π’ этом руководствС ΠΌΡ‹ рассмотрим, ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ…ΡΡˆ ΠΊΠΎΠΌΠΌΠΈΡ‚Π° ΠΈΠ· Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Docker.

Π­Ρ‚ΠΎ особСнно ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΏΡ€ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅ ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ Ρ‚ΠΎΡ‡Π½ΠΎΠΉ вСрсии ΠΊΠΎΠ΄Π°, выполняСмого Π² Π½Π°ΡˆΠΈΡ… ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π½Ρ‹Ρ… прилоТСниях.

2. ПониманиС ваТности Ρ…ΡΡˆΠ° ΠΊΠΎΠΌΠΌΠΈΡ‚Π°

Π₯эш ΠΊΠΎΠΌΠΌΠΈΡ‚Π° ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ΅ состояниС нашСй ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Π±Π°Π·Ρ‹ Π² систСмС контроля вСрсий. НаличиС этой ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ для отслСТивания ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΈ обСспСчСния согласованности Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… срСдах.

Π’ΠΈΠΏΠΈΡ‡Π½Ρ‹ΠΉ Ρ…ΡΡˆ ΠΊΠΎΠΌΠΌΠΈΡ‚Π° выглядит Ρ‚Π°ΠΊ: ce85e2ebe299cf9a8237556c86dbcaaa2d571a3e.

3. Π’Π΅Π³ ΠΎΠ±Ρ€Π°Π·ΠΎΠ² Docker с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ…ΡΡˆΠ° ΠΊΠΎΠΌΠΌΠΈΡ‚Π°

ΠŸΡ€ΠΈ сборкС ΠΎΠ±Ρ€Π°Π·ΠΎΠ² Docker принято ΠΏΠΎΠΌΠ΅Ρ‡Π°Ρ‚ΡŒ ΠΈΡ… Ρ…ΡΡˆΠ΅ΠΌ ΠΊΠΎΠΌΠΌΠΈΡ‚Π°.

Π­Ρ‚ΠΎ обСспСчиваСт Ρ‡Π΅Ρ‚ΠΊΡƒΡŽ связь ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΈ Ρ‚ΠΎΡ‡Π½Ρ‹ΠΌ состояниСм исходного ΠΊΠΎΠ΄Π°, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ½ Π±Ρ‹Π» собран.

3.1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈ Ρ‚Π΅Π³ ΠΎΠ±Ρ€Π°Π·Π°

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡ‚Π΅Π³Π°Ρ‚ΡŒ наш ΠΎΠ±Ρ€Π°Π· Docker Ρ…ΡΡˆΠ΅ΠΌ ΠΊΠΎΠΌΠΌΠΈΡ‚Π° Π² процСссС сборки, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

$ docker build --build-arg GIT_COMMIT=$(git rev-parse HEAD) -t my_image:$(git rev-parse HEAD)

Π’ этой ΠΊΠΎΠΌΠ°Π½Π΄Π΅ -build-arg GIT_COMMIT=$(git rev-parse HEAD) ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Ρ…ΡΡˆ ΠΊΠΎΠΌΠΌΠΈΡ‚Π° процСссу сборки Docker, Π° -t my_image:$(git rev-parse HEAD) ΠΏΠΎΠΌΠ΅Ρ‡Π°Π΅Ρ‚ собранный ΠΎΠ±Ρ€Π°Π· Ρ‚Π΅ΠΌ ΠΆΠ΅ Ρ…ΡΡˆΠ΅ΠΌ ΠΊΠΎΠΌΠΌΠΈΡ‚Π°, создавая ΠΏΡ€ΡΠΌΡƒΡŽ связь ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Docker ΠΈ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ состояниСм исходного ΠΊΠΎΠ΄Π°.

3.2. ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Dockerfile

ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ…ΡΡˆ фиксации Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° сборки ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² качСствС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния Π² Dockerfile:

FROM alpine
ARG GIT_COMMIT
ENV GIT_COMMIT=$GIT_COMMIT

4. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Ρ…ΡΡˆΠ° ΠΊΠΎΠΌΠΌΠΈΡ‚Π° ΠΈΠ· Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°

Когда ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π·Π°ΠΏΡƒΡ‰Π΅Π½, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ…ΡΡˆ ΠΊΠΎΠΌΠΌΠΈΡ‚Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ².

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ….

4.1. ИспользованиС Docker Inspect

Команда docker inspect позволяСт ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΡΡ‡Π΅Ρ€ΠΏΡ‹Π²Π°ΡŽΡ‰ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния.

Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠΎΠ»Π΅Π·Π΅Π½, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ…ΡΡˆ ΠΊΠΎΠΌΠΌΠΈΡ‚Π°, Π½Π΅ заходя Π² сам ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€.

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для достиТСния этой Ρ†Π΅Π»ΠΈ:

$ docker inspect --format='{{.Config.Env}}' <container_id>

НапримСр, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

$ docker inspect --format='{{.Config.Env}}' my_container

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

[PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin GIT_COMMIT=ce85e2ebe299cf9a8237556c86dbcaaa2d571a3e]

4.2. ΠŸΡ€ΡΠΌΠΎΠΉ доступ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ окруТСния

Если процСсс сборки устанавливаСт Ρ…ΡΡˆ фиксации ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ окруТСния Π² ΠΎΠ±Ρ€Π°Π·Π΅, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊ Π½Π΅ΠΌΡƒ доступ нСпосрСдствСнно ΠΈΠ· Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°.

Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ оказываСтся ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ, ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ Ρ…ΡΡˆ фиксации для скриптовых Ρ†Π΅Π»Π΅ΠΉ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°.

Π’ΠΎΡ‚ ΠΊΠΎΠΌΠ°Π½Π΄Π° для получСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния:

$ docker exec <container_id> printenv GIT_COMMIT

НапримСр, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ эту ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

$ docker exec my_container printenv GIT_COMMIT

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния этой ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ:

ce85e2ebe299cf9a8237556c86dbcaaa2d571a3e

5. Автоматизация процСсса

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ процСсс извлСчСния бСспрСпятствСнным, рассмотритС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ этих шагов Π² Ρ€Π°ΠΌΠΊΠ°Ρ… нашСго CI/CD-ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π°.

Π˜Π½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΡƒΠΉΡ‚Π΅ Ρ…ΡΡˆ-Ρ‚Π΅Π³ΠΈ ΠΊΠΎΠΌΠΌΠΈΡ‚Π° ΠΈ извлСчСния Π² наш ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ CI/CD, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒ ΠΈ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ шаги ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ:

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout code
      uses: actions/checkout@v2
    - name: Build Docker image
      run: docker build --build-arg GIT_COMMIT=${{ github.sha }} -t my_image:${{ github.sha }} .

6. Π Π°Π±ΠΎΡ‚Π° с ошибками

Иногда ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΈΠ· остановлСнного ΠΈΠ»ΠΈ Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ошибкам.

ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡ΡŒΡ‚Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ошибок Π² скриптах, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒΡΡ с Π½ΠΈΠΌΠΈ изящно.

Если ΠΌΡ‹ попытаСмся ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½Π΅Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ошибкой:

Error: No such object: <container_id>

ΠœΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ошибок Π² наши скрипты, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ с Ρ‚Π°ΠΊΠΈΠΌΠΈ случаями:

if ! docker inspect <container_id>; then
  echo "Container not found or not running"
fi

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

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ рассмотрСли Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ получСния Ρ…ΡΡˆΠ° ΠΊΠΎΠΌΠΌΠΈΡ‚Π° ΠΈΠ· Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ Docker-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°.

ΠŸΠΎΠΌΠ΅Ρ‚ΠΈΠ² наши ΠΎΠ±Ρ€Π°Π·Ρ‹ Ρ…ΡΡˆΠ΅ΠΌ ΠΊΠΎΠΌΠΌΠΈΡ‚Π° ΠΈ установив Π΅Π³ΠΎ Π² качСствС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ эту Π²Π°ΠΆΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ.

Π’Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ этих ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π² наш ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ CI/CD обСспСчиваСт ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒ ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ процСсс Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

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

 

Loading

You may also like

Leave a Comment