業務でubuntu:18.04イメージをベースとしたコンテナを使っていた時に、困った現象に出会いました.
それはlibmysqlclient-devをインストール後、nodejsnpmをaptでインストールするとlibmysqlclient-devが削除されるという現象です.

結論としては、

  • libmysqlclient-devlibssl-devに依存しているが、npmlibssl1.0-devに依存している
  • npmインストールする際にlibssl-devlibssl1.0-devが競合し、libssl-devと依存しているlibmysqlclient-devを削除する
  • Ubuntu公式リポジトリではなくnodesource/distributionsでaptリポジトリからNodeJSをインストールすれば良い

といった現象でした.

今のいままで問題なく動作していたんですが、昨日から動かなくなっていたので回避策があって良かったです.

挙動確認

挙動確認した時のコマンドを貼っておきます. ubuntu:18.04コンテナ上でaptの操作するだけで確認できます.

# Host
docker run --rm -it ubuntu:18.04 bash

# Ubuntu guest
apt update
apt install -y libmysqlclient-dev
apt install -s --no-remove nodejs npm # ERROR!

最後のapt install -s --no-remove nodejs npmのところのオプションについて軽く説明をしておきます.

-sオプションは、インストールやパッケージ削除などは行わないモードで、いわゆるDryRunです.
--no-removeオプションは、インストール時に他のパッケージが削除される場合にエラー終了させるためのオプションです.

コンテナイメージのビルドでaptを使う場合、--no-removeをつけておいた方が意図しないパッケージの削除が起こらないので、つけておいた方が良さそうです.