docker-compose up ができない (docker imageが存在しない旨のエラー)の解決メモ

いつの間にか入っていたコンテナ管理ツールのpodmanをremoveして、dockerをinstallし直したら、上手く動くようになった。


# 1. エラー概要

docker buildで指定したイメージ名をdocker-compose.yamlで指定したにも関わらず、docker-compose up時にイメージがない旨のエラーメッセージが表示される

## エラーメッセージ
```.bash
$ sudo docker-compose up
Pulling sinatra (my-ruby:dockerfile)...
ERROR: The image for the service you're trying to recreate has been removed. If you continue, volume data could be lost. Consider backing up your data before continuing.
 
Continue with the new image? [yN]
ERROR: pull access denied for my-ruby, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
```
Yと入力した場合
```.bash
Continue with the new image? [yN]y
Pulling sinatra (my-ruby:dockerfile)...
ERROR: pull access denied for my-ruby, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
```

# 2. 解決した方法
podmanをアンインストールしてdockerを入れたら上手く動くようになった。

### 原因
コンテナ管理ツールとしてDockerではなく（いつの間にか）Podmanが使用されていたこと。Dockerと似たような機能を使えるが少し挙動が違うことがある模様
https://qiita.com/MasatoEmata/items/444957133112577c8458#os-docker

### 対処
```.bash
$ history
sudo apt remove podman
sudo apt remove docker
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
docker -v
sudo docker build -t my-ruby:dockerfile ./sinatra/
sudo docker images
sudo docker-compose up
sudo docker ps
```
### 結果
```.bash
$ docker -v
Docker version 23.0.0, build e92dd87
 
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ce4f544a4a15 nginx:latest "/docker-entrypoint.…" 29 minutes ago Up 28 minutes 0.0.0.0:8000->80/tcp, :::8000->80/tcp demosinatra_nginx_1
3276333d6ee7 my-ruby:dockerfile "ruby app.rb -o 0.0.…" 29 minutes ago Up 29 minutes 0.0.0.0:4567->4567/tcp, :::4567->4567/tcp demosinatra_sinatra_1
```

# 3. 調査した内容、開発環境のメモ

## 検索したこと

Github Issue → image名が異なる・存在しない？
https://github.com/docker/compose/issues/7933


## 環境

### Directory/File
```.bash
$ ls
docker-compose.yaml mysql sinatra
 
$ ls sinatra/
Dockerfile  Gemfile  Gemfile.lock  app.rb
 
$ docker image ls
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/my-ruby dockerfile 0b0418fce3da 4 minutes ago 509 MB
…
 
$ cat docker-compose.yaml
version: '3'
 
# required: docker build -t my-ruby:dockerfile .
# same as below: docker run -v $PWD/sinatra:/opt/myapp -w /opt/myapp -d -p 4567:4567 my-ruby:dockerfile ruby app.rb -o 0.0.0.0
services:
  sinatra:
	image: my-ruby:dockerfile
	command: ruby app.rb -o 0.0.0.0
	ports:
  	- 4567:4567
	volumes:
  	- ./sinatra:/opt/myapp
	working_dir: /opt/myapp
	depends_on:
  	- mysql
```

※image名を下記のように「$ docker image ls」で表示される名前「localhost/my-ruby:dockerfile」に合わせて「docker-compose up」 を実行してもHTTP404エラーがレスポンスされる。なお、docker image lsで表示される name の「localhost/」の部分はDocker build時に明示的に指定したわけではなく勝手に付与される
→ コンテナ自体は起動できていて、アプリケーションの動作が想定外になっている模様。
```.bash
services:
  sinatra:
	image: localhost/my-ruby:dockerfile
```

### OS, Docker

VirtualBoxで動かしている
```.bash
$ lsb_release -a
No LSB modules are available.
Distributor ID:    Ubuntu
Description:    Ubuntu 22.04.1 LTS
Release:    22.04
Codename:    jammy
 
$ docker-compose -v
docker-compose version 1.29.2, build unknown
 
$ docker -v
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
podman version 3.4.4
```
→ コンテナ管理ツールとして、DockerではなくPodmanが使用されている。Dockerと似たような機能を使えるが少し挙動が違うことがある模様。Dockerコマンドを実行していても、実際にはpodmanコマンドが実行されるようになっている。またPodmanでビルドしたイメージには自動的に「localhost/」という名前がつくため、前述の「localhost/」が付いてしまう事象とも合致する。
https://github.com/containers/buildah/issues/1034

### 例外的に上手くいく場合
docker-compose.yamlを既存imageを読み込むのではなくbuild実行するように変更した場合は動いた
```yaml
services:
  sinatra:
    build: ./sinatra
```


## 4.備考：その他の関連するエラー
docker-compose up -dで各コンテナ起動後、指定した名前のコンテナのbashが実行できない。
- dockerコマンド全般使えない。
- docker-compose exec コマンドでは何も反応しない


### 実行ログ

docker ps -a ではコンテナが表示されない＝起動していない扱いになっている
```bash
$ docker ps -a
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

$ docker system df
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 5 0 2.742GB 2.742GB (100%)
Containers 0 0 0B 0B (0%)
Local Volumes 8 0 1.399GB 6.98GB (400%)
```

他方、sudo docker-compose ps では起動中のコンテナが表示される
```bash
$ sudo docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------
demosinatra_mysql_1 docker-entrypoint.sh Up 3306/tcp, 33060/tcp
mysqld
demosinatra_nginx_1 /docker-entrypoint.sh Up 0.0.0.0:8000-
ngin ... >80/tcp,:::8000-
>80/tcp
demosinatra_sinatra_1 ruby app.rb -o 0.0.0.0 Up 0.0.0.0:4567-
>4567/tcp,:::4567-
>4567/tcp
```

しかし、$ sudo docker-compose exec をしてもbashが起動しない
```bash
$ sudo docker-compose exec demosinatra_nginx_1 bash
$ sudo docker-compose exec -it demosinatra_nginx_1 bash
```
他方、docker exec ではコンテナが存在しないというエラーになる。
```bash
$ docker exec -it demosinatra_nginx_1 bash
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
Error: no container with name or ID "demosinatra_nginx_1" found: no such containe
```