Docker Ubuntu / hostnamectlで「command not found(コマンドが見つかりません)」

Dockerで作成したUbuntu hostnamectl コマンド 「command not found (コマンドが見つかりません)」

Dockerで作成したUbuntuのコンテナで hostnamectl を実行しようとしたら、「command not found(コマンドが見つかりません)」という表示がされました。

解決には至りませんでしたが、作業記録として記事にしました。

Docker Ubuntu / hostnamectlで「command not found(コマンドが見つかりません)」

結論

Dockerコンテナ内のUbuntuでhostnamectlは使えるようにすることはできませんでした。

環境

Ubuntu の環境は、以下のように構築しました。

  • ホストOS:Windows10 Pro
  • ゲストOS:CentOS7(CentOS Linux release 7.9.2009 (Core))
  • ゲストOSはVirtualBoxとVagrantで構築
  • ゲストOS上のDockerでUbuntuのコンテナを作成(Ubuntu 20.04.1 LTS)

エラー:hostnamectl で 「command not found」

Ubuntu で hostnamectl コマンドを実行したら「command not found(コマンドが見つかりません)」と表示されました。

# cat /etc/os-release
:
PRETTY_NAME="Ubuntu 20.04.1 LTS"
:
# hostnamectl
bash: hostnamectl: command not found

エラー:E: Unable to locate package systemd-services

hostnamectl コマンドを実行するために「systemd-services」というパッケージをインストールすると良いとのことで、実行すると、今度は「E: Unable to locate package systemd-services」というエラーが出てしまいました。

参考: apt – hostnamectl: command not found – Ask Ubuntu

# apt-get install systemd-services
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package systemd-services

apt をアップデートした後にhostnamectlしてみるがエラー

「E: Unable to locate package systemd-services」を解決するために、apt update コマンドを実行してみました。

参考:UbuntuでUnable to locate packageのエラー解決法

# apt update
Get:1 http://security.ubuntu.com/ubuntu focal-security InRelease [109 kB]
Get:2 http://archive.ubuntu.com/ubuntu focal InRelease [265 kB]
Get:3 http://security.ubuntu.com/ubuntu focal-security/main amd64 Packages [600 kB]
Get:4 http://archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB]
Get:5 http://archive.ubuntu.com/ubuntu focal-backports InRelease [101 kB]
Get:6 http://archive.ubuntu.com/ubuntu focal/main amd64 Packages [1275 kB]
Get:7 http://security.ubuntu.com/ubuntu focal-security/restricted amd64 Packages [161 kB]
Get:8 http://security.ubuntu.com/ubuntu focal-security/universe amd64 Packages [659 kB]
Get:9 http://security.ubuntu.com/ubuntu focal-security/multiverse amd64 Packages [13.3 kB]
Get:10 http://archive.ubuntu.com/ubuntu focal/multiverse amd64 Packages [177 kB]
Get:11 http://archive.ubuntu.com/ubuntu focal/restricted amd64 Packages [33.4 kB]
Get:12 http://archive.ubuntu.com/ubuntu focal/universe amd64 Packages [11.3 MB]
Get:13 http://archive.ubuntu.com/ubuntu focal-updates/restricted amd64 Packages [194 kB]
Get:14 http://archive.ubuntu.com/ubuntu focal-updates/universe amd64 Packages [921 kB]
Get:15 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages [1005 kB]
Get:16 http://archive.ubuntu.com/ubuntu focal-updates/multiverse amd64 Packages [21.1 kB]
Get:17 http://archive.ubuntu.com/ubuntu focal-backports/universe amd64 Packages [4301 B]
Fetched 17.0 MB in 1min 13s (234 kB/s)
Reading package lists... Done
Building dependency tree
Reading state information... Done
5 packages can be upgraded. Run 'apt list --upgradable' to see them.

いざ、hostnamectlを実行してみたところ、今度は以下のようなエラー。

# hostnamectl
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to create bus connection: Host is down

似たようなエラー対処をしている記事を見つけました。

どうにもプロセスID1で動作しているのがsystemdじゃないということらしい。ので、プロセスID1で動作するプロセスをsystemdにしてやればOK、とのこと。

現在動作しているプロセスを表示するコマンド ps コマンドで確認してみます。
(a: 端末操作のプロセスを表示、u: CPUやメモリの使用率なども表示、x: 現在実行しているプロセスのみを表示)

# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1   4232  2288 pts/0    Ss   Feb01   0:00 /bin/bash
root      3506  0.0  0.0   5888  1472 pts/0    R+   03:59   0:00 ps aux

Ubuntuのコンテナの作り直しを試みるがNG

上記の記事を参考に、DockerコンテナのUbuntuから exit して、ゲストOS(CentOS7)にてUbuntuのコンテナの作成を試みました。

ですが、私の環境では、以下のようなエラーが発生して、うまく起動できませんでした。

# ls -l /sbin/init
lrwxrwxrwx. 1 root root 22 Nov 18 22:08 /sbin/init -> ../lib/systemd/systemd
# docker run -it --cap-add=SYS_ADMIN -v /sys/fs/cgroup:/sys/fs/cgroup:ro ubuntu /sbin/init
docker: Error response from daemon: OCI runtime create failed: container_linux.go:370: starting container process caused: exec: "/sbin/init": stat /sbin/init: no such file or directory: unknown.

dockerコンテナ内ではsystemctlやhostnamectlは使えない?

上記のようにやってみましたが、泥沼にハマりそうでしたので、ここで作業は中断しました。

以下の記事でも同じような問題に取り組んでるようでしたが、うまくいかなかった結果と考察をまとめてくれてます。

Dockerコンテナ内のUbuntuではsystemctlは使えない – Qiita

結局[PID1 = /sblin/init]で起動させることは難しそう。
色々と調べてみたが、dockerコンテナ内ではプロセス管理ツールとしてsystemdは基本的に使えない。

以上、Dockerで作成したUbuntuのコンテナで hostnamectl を実行を試みた記録でした。