🐳

Alpine Linux v3.11のEOLでちょっとだけ苦しんだ話

2021/11/10に公開

👋v3.11がEOLに

2021/11/01にalpine v3.11がEOLになったみたいです。
https://endoflife.date/alpine

🔍Dockerhubでalpineベースのimageにアップデートを確認

サンプルでNode.js
画像のように直近でアップデートがされていたことを確認。

https://hub.docker.com/_/node?tab=tags

👀docker build時の変化

docker build時に依存関係を検索するalpineのパッケージが以下のように変更されていました。
https://dl-cdn.alpinelinux.org/alpine/v3.11/main

https://dl-cdn.alpinelinux.org/alpine/v3.14/main

🧑‍💻環境

今回使用したDockerfile

FROM node:14.18.1-alpine

RUN apk add --no-cache --virtual .build-deps coreutils && \
  cp /bin/date /usr/local/bin/date && \
  apk del --purge .build-deps

ENTRYPOINT ["sh"]

😇コマンドが動かなくなってる

コンテナの中で今まで以下のようにGNUcoreutilsdateコマンドを利用していました。

date +%Y/%m/%d --date '-1 days ago'
2021/11/09

が、build後のイメージで動かしていたところ、以下のようなエラーが発生。

date +%Y/%m/%d --date '-1 days ago'
Error loading shared library libutmps.so.0.1: No such file or directory (needed by /usr/local/bin/date)

✍️原因

alpine v3.14用のパッケージに含まれるcoreutilsのバージョンがアップデートされていたことが判明。

v3.14のcoreutils
https://alpine.pkgs.org/3.14/alpine-main-x86_64/coreutils-8.32-r2.apk.html

v3.11のcoreutils
https://alpine.pkgs.org/3.11/alpine-main-x86_64/coreutils-8.31-r0.apk.html

coreutils-8.32-r2の依存関係をよく見ると、エラーメッセージで見た様なパッケージが。。

https://alpine.pkgs.org/3.14/alpine-main-x86_64/utmps-0.1.0.2-r0.apk.html

🎉直った

最終的には、以下のようにDockerfileを修正することで解決に至りました。

FROM node:14.18.1-alpine

# utmpsが足りなかった依存パッケージ
RUN apk add --no-cache utmps && \
  apk add --no-cache --virtual .build-deps coreutils && \
  cp /bin/date /usr/local/bin/date && \
  apk del --purge .build-deps

ENTRYPOINT ["sh"]

📚余談

元々GNUcoreutilsのdateコマンドを使っていたので、このような解決方法に至りましたが、
BusyBoxのdateコマンドを使って回避することもできます。

# BusyBox
date -d "1970.01.01-00:00:$(( $( date +%s ) - $(( 24 * 60 * 60 )) ))" +%Y/%m/%d
2021/11/09

# GNU
date +%Y/%m/%d --date '-1 days ago'
2021/11/09

Discussion