Częścią obrazów kontenerów, które używam w swoich środowiskach sieciowych zarządzam samodzielnie. Ich cykliczną budową zajmuje się Jenkins. Także kontenery z obrazem samego Jenkinsa są budowane w ten sposób. 10 sierpnia coś się jednak stało. Mój skrypt przestał działać. W efekcie tego przestał budować się obraz kontenera. Wszystko ze względu na zmiany w pakietach z językiem Python w dystrybucji Alpine Linux. Jeżeli budujesz obrazy w oparciu o tą właśnie dystrybucję, to w tym artykule znajdziesz rozwiązanie.
Błąd pakietu python-dev
W jednym z kroków budowy obrazu kontenera Jenkinsa muszę doinstalować kilka dodatkowych pakietów. Zapewniają one poprawne działanie wtyczek, które używam do wykonywania różnych zadań. Wśród nich jest język Python oraz jego paczka developerska. Błąd, który widać było w logach wyglądał następująco:
Step 38/46 : RUN apk add shadow gcc libffi-dev python-dev linux-headers musl-dev openssl-dev make automake openrc ---> Running in 0a5112255ad6 ERROR: unsatisfiable constraints: python-dev (missing): required by: world[python-dev]
Ja w swoich skryptach budujących obraz nic nie zmieniałem. Mój skrypt korzysta jednak jako bazy z pliku Dockerfile-alpine z repozytorium https://github.com/jenkinsci/docker, który jest odpowiedzialny za instalację Jenkins-a w obrazie bazowym Alpine Linux ze środowiskiem JDK8. I właśnie w tym pliku nastąpiła zmiana.
- FROM openjdk:8-jdk-alpine + FROM adoptopenjdk/openjdk8:jdk8u262-b10-alpine
Została zmieniony obraz bazowy, który określony jest w regule FROM. Poza tym zmieniona została wersja Jenkinsa, który domyślnie za pomocą Dockerfile-alpine jest budowany. Pełną listę zmian w tym pliku możesz zobaczyć tutaj.
Dlaczego przestało działać?
Jeżeli pogrzebiesz głębiej i porównasz obraz openjdk:8-jdk-alpine oraz adoptopenjdk/openjdk8:jdk8u262-b10-alpine zauważysz, że bazują na różnych wersjach Alpine Linux. Drugi z nich bazuje na nowszym wydaniu dystrybucji, gdzie nastąpił podział pakietów z elementami języka Python na oddzielne dla Python2 oraz Python3. Zniknęła paczka python-dev, która zawierała pakiet developerski języka Python w wersji 2.7. Od dawna wiele dystrybucji Linuksa zawiera pakiety obu wersji języka Pyhon, dlatego konieczna była zmiana nazwy pakietów. Ponadto musimy pamiętać, że Python2 nie jest już wspierany i zalecane jest stosowanie jedynie Python3.
Rozwiązaniem mojego problemu było bardzo proste – w miejsce paczki python-dev musiałem zainstalować paczkę python3-dev. Ta drobna zmiana wymusiła oczywiście także instalację języka Python w wersji 3 wewnątrz obrazu kontenera.
- RUN apk add shadow gcc libffi-dev python-dev linux-headers musl-dev \ + RUN apk add shadow gcc libffi-dev python3-dev linux-headers musl-dev \
Dlatego zawsze trzeba zafiksować wersje oraz nigdy nie polegać na publicznie dostępnych pre-bildowanych image’ach.
Akurat w tym konkretnym przypadku bazą była recepta z oficjalngo projektu Jenkinsa, która miała zafixowaną wersję obrazu, tylko, że ona się zmieniła właśnie.