業務でubuntu:18.04
イメージをベースとしたコンテナを使っていた時に、困った現象に出会いました.
それはlibmysqlclient-dev
をインストール後、nodejs
とnpm
をaptでインストールするとlibmysqlclient-dev
が削除されるという現象です.
結論としては、
libmysqlclient-dev
はlibssl-dev
に依存しているが、npm
はlibssl1.0-dev
に依存しているnpm
インストールする際にlibssl-dev
とlibssl1.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
をつけておいた方が意図しないパッケージの削除が起こらないので、つけておいた方が良さそうです.