docker initを使ってみる

#　docker initでdockerファイルを自動作成が出来ると見かけたので使用してみる

## docker initで生成されるファイル一覧
```
.dockerignore
Dockerfile
compose.yaml
README.Docker.md
```

## コマンドラインで「docker init」と入力すると下記のような選択画面が表示される
```
? What application platform does your project use?  [Use arrows to move, type to filter]
> Go - suitable for a Go server application
  Python - suitable for a Python server application
  Node - suitable for a Node server application
  Rust - suitable for a Rust server application
  ASP.NET Core - suitable for an ASP.NET Core application
  PHP with Apache - suitable for a PHP web application
  Java - suitable for a Java application that uses Maven and packages as an uber jar
  Other - general purpose starting point for containerizing your application
  Don't see something you need? Let us know!
  Quit
```

## Otherを選択した場合のDockerfileとcompose.yamlの中身
- ファイルに記載されている英語を翻訳ツールを使用して日本語にしています

```text:Dockerfile
# syntax=docker/dockerfile:1

# このファイル全体を通して、使い始めるためのコメントが提供されています。
# さらにヘルプが必要な場合は、以下のDockerfileリファレンスガイドをご覧ください。
# このテンプレートをより良いものにするために協力したいですか? ここでフィードバックを共有しましょう: https://forms.gle/ybq9Krt8jtBL3iCk7

################################################################################
このファイル内の他のビルドステージの基礎となる # ベースイメージを選択します。
# このファイル
#
# 説明のために、以下のFROMコマンドを使用します。
# alpineイメージを使用しています(https://hub.docker.com/_/alpine)。最新の "latest "タグを指定することで, そのイメージの最新バージョンを利用することができます.
# "latest "タグを指定することで、Dockerfileをビルドする際に、そのイメージの最新バージョンが使われます。
# 再現性を重視するのであれば、バージョン指定のタグを使うことを考慮
# してください。
# (例: alpine:3.17.2)またはSHA (例: alpine@sha256:c41ab5c992deb4fe7e5da09f67a8804a46bd0592bfdf0b1847dde0e0889d2bff) を使うことを検討してください。
FROM alpine:latest as base

################################################################################
# アプリケーションをビルド／コンパイルするためのステージを作成する。
# 
# 以下のコマンドは、上記の "base "ステージを利用して、"hello world "スクリプトを生成し、実行可能にする。
# スクリプトを生成し、実行可能にします。
# 実際のアプリケーションでは、アプリケーションのビルド・プロセスに対してRUNコマンドを発行し、実行ファイルを生成します。
# 実行ファイルを生成する。言語固有の例については、
# Awesome ComposeリポジトリのDockerfileを参照してください: https://github.com/docker/awesome-compose

FROM base as build
RUN echo -e '#!/bin/shn\
echo Hello world from $(whoami)！アプリケーションをコンテナで実行するには、Dockerfileのコメントを見て始めましょう。
> /bin/hello.sh
RUN chmod +x /bin/hello.sh

################################################################################
# アプリケーションを実行するための最終ステージを作成する。
#
# 以下のコマンドは、上記の "build "ステージからの出力をコピーし、イメージの実行時にそれを実行するようにコンテナー・ランタイムに指示する。
# を実行するようにコンテナ・ランタイムに指示します。理想的には、このステージ
# このステージには、アプリケーションの最小限のランタイム依存関係を含めるのが理想的です。
# 可能な限り小さなイメージを生成する。これは多くの場合、アプリケーションのビルドに使用したイメージとは異なる、より小さな
# を使用することを意味しますが、説明のために「ベース」イメージを使用します。
# ここでは「ベース」イメージを使用します。
FROM base AS final

# アプリが実行される非特権ユーザーを作成します。
FROM base AS final

# Create a non-privileged user that the app will run under.
# See https://docs.docker.com/go/dockerfile-user-best-practices/
ARG UID=10001
RUN adduser \
    --disabled-password \
    --gecos "" \
    --home "/nonexistent" \
    --shell "/sbin/nologin" \
    --no-create-home \
    --uid "${UID}" \
    appuser
USER appuser

# ビルド段階から実行ファイルをコピーする。
COPY --from=build /bin/hello.sh /bin/

# コンテナ起動時に実行すべき内容
ENTRYPOINT [ "/bin/hello.sh" ]

```

```text:compose.yaml
# このファイルには、使い始めの手助けとなるようなコメントが書かれています。
さらにヘルプが必要な場合は、以下のDocker composeリファレンスガイドを参照してください。
# https://docs.docker.com/go/compose-spec-reference/

# ここでは、アプリケーションを "app "というサービスとして定義します。
# このサービスはカレントディレクトリのDockerfileからビルドされます。
# ここで、アプリケーションが依存する可能性のある他のサービスを追加できます。
# データベースやキャッシュなどです。例については、Awesome Composeのリポジトリを参照してください：
# https://github.com/docker/awesome-compose
services:
  app:
    build:
      context: .
      target: final
    # アプリケーションがポートを公開している場合は、以下の行のコメントを外し、必要に応じてポート番号を変更してください。
    # 最初の番号はホスト・ポートで、2 番目の番号はコンテナ内のポートである。
    # ports:
    #   - 8080:8080

    # 以下のコメントアウトされたセクションは、アプリケーションが使用できるPostgreSQLデータベースを定義する方法です。
    # depends_on`はDocker Composeに次のように指示します。
    # db-data`ボリュームは、コンテナの再起動時にデータベースのデータを保持します。
    # db-password`シークレットは、データベースのパスワードを設定するために使用する。
    # docker compose up` を実行する前に `db/password.txt` を作成し、そこに任意のパスワードを追加する必要がある。
    #     depends_on:
    #       db:
    #         condition: service_healthy
    #   db:
    #     image: postgres
    #     restart: always
    #     user: postgres
    #     secrets:
    #       - db-password
    #     volumes:
    #       - db-data:/var/lib/postgresql/data
    #     environment:
    #       - POSTGRES_DB=example
    #       - POSTGRES_PASSWORD_FILE=/run/secrets/db-password
    #     expose:
    #       - 5432
    #     healthcheck:
    #       test: [ "CMD", "pg_isready" ]
    #       interval: 10s
    #       timeout: 5s
    #       retries: 5
    # volumes:
    #   db-data:
    # secrets:
    #   db-password:
    #     file: db/password.txt

```

## 使ってみた感想
dockerファイルの雛形を自動作成してくれるのはいいが、結局中身を確認してファイルをいじるための知識が必要なことは変わらなかった。。。
dockerファイルの中身を見なくて済むように、そう簡単にはならないよな。