oc new-app で Service が自動作成される条件を確かめる

# 確認したい事

OpenShift の `oc new-app` で自動で `Service` リソースまで自動で作ってくれるのは、`Dockerfile` 内で `EXPOSE` を定義しているためか確認する。

# この作業に使ったファイルの GitHub レポ
https://github.com/yuhkih/no-expose-nginx

# EXPOSE 無しの Docker イメージをビルドする

もともと `oc new-app` をすると、`Service` リソースが作成されていたコンテナの `Dockerfile` から、`EXPOSE` をコメントアウトしてビルドしてみる。


```Dockerfile
$ cat Dockerfile 
# FROM registry.access.redhat.com/ubi8/ubi:latest
FROM redhat/ubi8
MAINTAINER "yuhkih" 

RUN dnf install -y nginx
COPY index.html /usr/share/nginx/html/index.html
COPY nginx.conf /etc/nginx/nginx.conf # この中でデフォルトのPortを80=>8080に変更している。

# EXPOSE 8080 # ここをコメントアウトしてみる。

CMD ["-g","daemon off;"]
ENTRYPOINT ["nginx"]
$ 

```

Build する。

```
docker build . -t yuhkih/no-expose-nginx:latest  
```

自分の Docker Hub に Push する。

```
docker push  yuhkih/no-expose-nginx:latest 
```

OpenShif で新しいプロジェクトを作成する

```
oc  new-project no-expose-nginx
```

`oc new-app` で、アプリケーションを作成する

```
oc new-app --image=docker.io/yuhkih/no-expose-nginx -l=test=app1
```

作成物を確認する。

```
$ oc get all
NAME                                   READY   STATUS    RESTARTS   AGE
pod/no-expose-nginx-5cdcfcd856-c6nbh   1/1     Running   0          6s

NAME                              READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/no-expose-nginx   1/1     1            1           8s

NAME                                         DESIRED   CURRENT   READY   AGE
replicaset.apps/no-expose-nginx-5cdcfcd856   1         1         1       6s
replicaset.apps/no-expose-nginx-f465bc89c    0         0         0       8s

NAME                                             IMAGE REPOSITORY                                                                                                  TAGS     UPDATED
imagestream.image.openshift.io/no-expose-nginx   default-route-openshift-image-registry.apps.f5cluster.m51o.p1.openshiftapps.com/no-expose-nginx/no-expose-nginx   latest   6 seconds ago
$ 
```
`Service` リソースは作成されてない。
`oc new-app` は `EXPOSE` を見て `Service` リソースを作成しているようだ。

作成物を削除する。作る時は一瞬でも消すのは個別なので `oc new-app` 実行時にラベルを振っておくと一気に消せる。

```
 oc delete all -l=test=app1
```


# 一体どこを見て EXPOSEを判別しているのか探る

きっとコンテナの中に情報を書いてるんだろうな。と思ったので、中を調べて見る｡

先ほどとは、違う `EXPOSE 8080` をしている [こちら](https://github.com/yuhkih/hello-openshift/blob/main/Dockerfile) のDockerfile でビルドしたコンテナを使用する。

```
[user@yuhki-nano tmp]$ docker images
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
REPOSITORY                           TAG         IMAGE ID      CREATED       SIZE
docker.io/yuhkih/hello-openshift     latest      3ce482bbd16a  27 hours ago  320 MB
[user@yuhki-nano tmp]$ 
```

image を `docker save` で `tar` ファイルにする。

```
[user@yuhki-nano tmp]$ docker save 3ce482bbd16a -o test.tar
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
Copying blob 5bf135c4a0de done  
Copying blob 773711fd02f0 done  
Copying blob f2802c86fb2b done  
Copying blob b647bf8a3943 done  
Copying blob f72a66d71708 done  
Copying config 3ce482bbd1 done  
Writing manifest to image destination
Storing signatures
[user@yuhki-nano tmp]$ ls -ltr
total 312724
-rw-r--r-- 1 user user 320228864 Jun 25 15:22 test.tar
[user@yuhki-nano tmp]$ 
```

`tar` を解凍する。

```
[user@yuhki-nano tmp]$ tar xvf test.tar
5bf135c4a0de07e52c11282c0954e3e6b7c7ddc6c8834a7fd2803c3dc6a31a69.tar
773711fd02f009e3bc5f9e2b1e859bf2103ba7318b3eb73390490afb3a3a8848.tar
f2802c86fb2b1f8a99de11a33db47d82820758c4c7b8859b129b42a12acf2823.tar
b647bf8a3943fd2bacbe7018589c5a36fce5cbc8d74586fb3d9b45289362a4d6.tar
f72a66d717083bac9078f6fc9697c373678de4899e780ef854b0aab14fbefd6e.tar
3ce482bbd16acdcaf250439a26ecb667d08e7f920ecc89172c214d029b197a14.json
acb4ae1aab63dd8c486ca4e4509109088a9e0635272ee25b765a4c26c2e9ec94/layer.tar
acb4ae1aab63dd8c486ca4e4509109088a9e0635272ee25b765a4c26c2e9ec94/VERSION
acb4ae1aab63dd8c486ca4e4509109088a9e0635272ee25b765a4c26c2e9ec94/json
d8bd10da77f1eb5aea64bff16f0e76b4d36b815e65da87ee44b58713fbf98eab/layer.tar
d8bd10da77f1eb5aea64bff16f0e76b4d36b815e65da87ee44b58713fbf98eab/VERSION
d8bd10da77f1eb5aea64bff16f0e76b4d36b815e65da87ee44b58713fbf98eab/json
270752333af28d48c543e4f6349f3016196fa16d1611b0824b5722e6a2ce79ea/layer.tar
270752333af28d48c543e4f6349f3016196fa16d1611b0824b5722e6a2ce79ea/VERSION
270752333af28d48c543e4f6349f3016196fa16d1611b0824b5722e6a2ce79ea/json
b62dec2106e6e41da648dfa5c0fadb0cf1fd4e5b3756d47f842a4f8043076c27/layer.tar
b62dec2106e6e41da648dfa5c0fadb0cf1fd4e5b3756d47f842a4f8043076c27/VERSION
b62dec2106e6e41da648dfa5c0fadb0cf1fd4e5b3756d47f842a4f8043076c27/json
9716e8c64a07746bd45654cea4425dbe93e6a3b4f955f24116d5fccfa729ca74/layer.tar
9716e8c64a07746bd45654cea4425dbe93e6a3b4f955f24116d5fccfa729ca74/VERSION
9716e8c64a07746bd45654cea4425dbe93e6a3b4f955f24116d5fccfa729ca74/json
manifest.json
repositories
[user@yuhki-nano tmp]$ 
```

幾つか怪しそうなファイルがあるが、とりあえず `3ce482bbd16acdcaf250439a26ecb667d08e7f920ecc89172c214d029b197a14.json` を開いて見る。
一行だったので、適当に改行を入れて見やすくする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/f6cdadf2-4cf7-4af9-6ef4-0969c21e3f7f.png)
`ENTRYPOINT` や `CMD` だけでなく `EXPOSE` したポートなども記載されているのがわかる。