VSCodeにてDocker(CentOS7)のFlask環境を構築(venv使用)

# 環境
macOS Monterey
VSCode 1.73.0
docker desktop 4.13.1
docker Engine 20.10.20
docker Compose v2.12.1
Python 3.9.15
Flask 2.2.2


# DockerにてCentOS7立ち上げ

Dockerインストール
https://qiita.com/suzukiti/items/391bfce352ba94ad3f0d#docker%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

なんか以前自分が書いたみたいでした。
VSCodeのDev containers拡張機能を使います。(これも上の記事に書いてあった)

## コード(結論)

```json:devcontainer.json
{
  "name": "sample_flask_app",
  "dockerComposeFile": ["./docker-compose.yml"],
  "service": "app",
  "workspaceFolder": "/home",
  "forwardPorts": ["50000:5000"],
  "extensions": [
    "streetsidesoftware.code-spell-checker", // スペルミス防止
    "mhutchie.git-graph", // Git見やすく
    "eamodio.gitlens", // Git見やすく
    "oderwat.indent-rainbow", // インデントわかりやすく
    "mosapride.zenkaku", // 不必要なミス防止
    "ms-python.python",
    "KevinRose.vsc-python-indent"
  ]
}
```

```yaml:docker-compose.yml
version: '3.8'

services:
  app:
    build: ./
    container_name: flask-docker
    ports:
      - "50000:5000"
    volumes:
      - "/Users/suzukiti/dev/sample_flask_app:/home/sample_flask_app"
    command: /bin/bash
    tty: true
```

```docker:dockerfile
FROM centos:centos7
RUN mkdir /home/sample_flask_app
```
### 補足(直面したエラー)

1. ```load metadata for docker.io/library/centos:centos7```と```server misbehaving```
DNSの問題だそうです。
ホスト(mac)の/etc/resolv.confのnameserverを8.8.8.8にする。

1. ```The path /User/suzukiti/dev/sample_flask_app is not shared from the host and is not known to Docker.```
Userではなく、Usersです。(スペルミス)
それでもエラるなら、docker＞Preferences＞Resources>File sharingで該当のパスを追加してあげる。

1. ```Ports are not available```
```netstat -ao | grep [ポート番号]```で該当ポート使用状況を確認。
変える場合は、
- ```devcontainer.json```の```forwardPorts```を```["Macのポート番号:コンテナ(docker)のポート番号"]```にする
- ```docker-compose.yml```の```ports```も```"Macのポート番号:コンテナ(docker)のポート番号"```にする

# Python3インストール
CentOS7に標準で入っているPythonバージョンは2.x系でEOLなので
3.x系をインストールします。
~~今回は、3.10.8を使います。~~
※3.10.8でインストールしようとすると、
centosのopensslのversionが1.1.0より前(1.0.2)なので、
上手くインストールできません。(3.10以降は1.1.0以降が必須みたい)
https://www.python.jp/news/wnpython310/require-openssl11.html

centosにopensslの1.1.0以降を入れればいけますが、
サードパーティのリポジトリを入れたりと、大変なので、今回は3.9.15で行きます。

:::note
参考：https://qiita.com/ksugawara61/items/ba9a51ebfdaf8d1a1b48
:::

```bash:ターミナル
# システムパッケージをアップデート
yum -y update
# 依存パッケージのインストール；https://github.com/pyenv/pyenv/wiki#suggested-build-environment
yum install -y gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel tk-devel libffi-devel xz-devel git
# make使えないとエラるのでそれも追加
yum install -y make
# pyenvリポジトリをクローン
git clone https://github.com/pyenv/pyenv.git $HOME/.pyenv
# .bash_profileにpyenvのPATHを追加
echo 'export PATH="$HOME/.pyenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
# pyenvバージョン確認
pyenv --version

# 現在のpythonバージョンを確認
python --version
# python3.9.15インストール
pyenv install 3.9.15
# pythonバージョン切り替え
pyenv global 3.9.15
pyenv rehash
# 変更されたか確認
python --version
```

# venv(仮想環境)構築

::: note
参考：https://qiita.com/fiftystorm36/items/b2fd47cf32c7694adc2e
:::

```bash:ターミナル
cd sample_flask_app
# 新環境作成
python3 -m venv venv
# アクティベート
source venv/bin/activate
# バージョン確認
python -V
# pipアップデート
pip install --upgrade pip
# pipバージョン確認
pip -V
# パッケージインストール
pip install [package name]
# インストール済みのパッケージ確認
pip freeze
# ディアクティベート
deactivate
# pipバージョン確認
pip -V
```

```deactivate```前後でおそらくpipのバージョンが異なると思います。
venv構築成功です。

# flaskインストール

::: note
参考：https://msiz07-flask-docs-ja.readthedocs.io/ja/latest/installation.html
:::

```bash:ターミナル
# 仮想環境アクティベート
cd sample_flask_app
source venv/bin/activate
# インストール
pip install Flask
# バージョン確認
flask --version
```

# 所感
時間かかるし、大量にエラるしで、
pythonのインストールが大変でした。
参考になれば幸いです。