Docker(docker-compose)でCentOS8のコンテナを利用する（ERROR: No container found forの解消）

# はじめに

`docker` `docker-compose` `centos8`などのキーワードを利用して、Google先生に尋ねると、大体出てくる記事はCentOS`に`dockerとかdocker-composeをインストールする方法が出てくる。

CentOS8からはyumではなくdnfコマンドによってパッケージ管理を行う仕組みが導入されているのだとか。
そんな話しを2020年になるまで知らなかった。。。（正確には知っていても試してみなかった。。。）

なので、せっかくdockerを少しずつ勉強しているので、お手軽にCentOS8の環境を用意して試してみようと思ったところで、いきなり少しつまずいたので、その部分も踏まえて新年（2020年）一発目のQiita記事としてまとめました。

# 最小の設定でCentOS8を起動して試してみる

## ディレクトリ構成と各設定内容

最小の設定とはいえ、後々`yum -y update`みたいなものと同じであろう`dnf -y update`みたいなこともDockerfile内で指定しようと思っているので、Dockerfileは作成する。

```shell-session:ディレクトリ構成
.
├── Dockerfile
└── docker-compose.yml
```

```yaml:docker-compose.yml
version: '3'
services:
  centos8:
    container_name: "centos8"
    build: ./
```

```dockerfile:Dockerfile
FROM centos:8
```

## 動作検証

とりあえずBuild

```shell-session
$ docker-compose build --no-cache
```

up

```shell-session
$ docker-compose up -d
```

コンテナにアクセスしてみる

```shell-session
$ docker-compose exec centos8 bash
ERROR: No container found for centos8_1
```

・・・ん？

エラーが出てしまい、コンテナにアクセスできない状況となっている。
ログを確認してみる。

```shell-session
$ docker-compose logs
Attaching to centos8
```

ログにはエラーが出ていないように見える。
プロセスを確認してみる。

```shell-session
$ docker-compose ps
 Name      Command    State    Ports
------------------------------------
centos8   /bin/bash   Exit 0        
```

正常に終了しています。みたいなステータスになっている。
どうやらdocker-compose.ymlファイルのオプションに`tty`を`true`で設定を追加する必要があるようです。

[docker-compose up したコンテナを起動させ続ける方法](https://qiita.com/sekitaka_1214/items/2af73d5dc56c6af8a167)の記事を参考にしました。

```yaml:docker-compose.yml
version: '3'
services:
  centos8:
    container_name: "centos8"
    build: ./
    tty: true  # ← 追記
```

再度コンテナを起動し直して、コンテナにアクセスしなおしてみる。

```shell-session
$ docker-compose down
$ docker-compose up -d
$ docker-compose exec centos8 bash
$ docker-compose exec centos8 bash
[root@ac4fc975a84d /]# cat /etc/redhat-release
CentOS Linux release 8.0.1905 (Core) 
```

確認できました。
とりあえず、これでCentOS8の確認ができる準備が整ったので、`yum`が使えなくなっているのかぐらいは検証してみようと思います。

# yumは使えないのか？

```shell-session
# yum -y update
Failed to set locale, defaulting to C
CentOS-8 - AppStream                                                        1.3 MB/s | 6.3 MB     00:04    
CentOS-8 - Base                                                             2.8 MB/s | 7.9 MB     00:02    
CentOS-8 - Extras                                                           515  B/s | 2.1 kB     00:04    
Dependencies resolved.
============================================================================================================
 Package                    Arch             Version                              Repository           Size
============================================================================================================
Upgrading:
 bash                       x86_64           4.4.19-8.el8_0                       BaseOS              1.5 M
 bind-export-libs           x86_64           32:9.11.4-17.P2.el8_0.1              BaseOS              1.1 M
 dracut                     x86_64           049-10.git20190115.el8_0.1           BaseOS              361 k
 dracut-network             x86_64           049-10.git20190115.el8_0.1           BaseOS               96 k
 dracut-squash              x86_64           049-10.git20190115.el8_0.1           BaseOS               52 k
.......
Installed:
  libxkbcommon-0.8.2-1.el8.x86_64        diffutils-3.6-5.el8.x86_64        hardlink-1:1.3-6.el8.x86_64    
  kbd-2.0.4-8.el8.x86_64                 kpartx-0.7.8-7.el8_0.2.x86_64     pigz-2.4-2.el8.x86_64          
  xkeyboard-config-2.24-3.el8.noarch     kbd-legacy-2.0.4-8.el8.noarch     kbd-misc-2.0.4-8.el8.noarch    

Complete!
```

yumは使えるみたいですね。
どうやらyumが使えるのはdnfへのシンボリックリンクになっているため、CentOS8でも使えるんだとか。
本当にそうなのか念のため確認してみようと思います。

```shell-session
# which yum
bash: which: command not found
```

今度は`which`コマンドが無い。。。さすがDocker
無駄なものを省いた最小構成のイメージだけはある。
whichコマンドをyumでインストールしてから確認してみると、確かに`yum -> dnf-3`となっていて、シンボリックリンクになっていることが分かります。

```shell-session
# yum -y install which
Failed to set locale, defaulting to C
Last metadata expiration check: 0:09:38 ago on Tue Dec 31 20:35:39 2019.
Dependencies resolved.
....

# which yum
/usr/bin/yum

# ls -la | grep yum
lrwxrwxrwx 1 root root       5 May 13  2019 yum -> dnf-3
```

と、ここで`yum -y install ...`コマンドの実行直後の行に`Failed to set locale, defaulting to C`が出ているのに気付きました。

これは日本語の言語パッケージがインストールされていないことが原因とのこと。
https://qiita.com/takizawafw6o2o/items/d6a15b5ae05d85ae1f41#%E5%8E%9F%E5%9B%A0

なので同じようにインストールしてみる。
もうここまでで`yum`が`dnf`のシンボリックリンクであることがわかったため、今後慣れていくためにも`dnf`コマンドを利用するようにします。

```shell-session
# dnf -y install langpacks-ja
...
Installed:
  langpacks-ja-1.0-12.el8.noarch                   glibc-langpack-ja-2.28-42.el8.1.x86_64                  

Complete!
```

言語パッケージをインストールしたので`yum list`で`Failed to set locale, defaulting to C`が出ないことを確認する。あ、`dnf list`ですね。

```shell-session
# dnf list
Failed to set locale, defaulting to C
```

なおらない。
http://tihiro.hatenablog.com/entry/2017/10/12/075555
この記事を参考に`LC_ALL`を設定してみます。

```shell-session
# export LC_ALL=C
# dnf list
```

これで出なくなるみたいです。