エラーログをちゃんと見て一瞬で解決したので、自慢がてら久々に記事を書いてみようと思った次第です。
やりたいこと
以下のDockerfileを準備して、MacOS上でFlaskを起動したい
Dockerfileは docker-compose から読み込む形にする
遭遇したこと
Flaskが5000ポートで上手く立ち上がらなかったので困った。。。
環境
MacOS Sonoma 14.2.1
Docker version 24.0.7
Dockerfile
FROM python:3
RUN apt-get update
RUN pip install --upgrade pip
RUN mkdir /usr/src/app
ADD . /usr/src/app
WORKDIR /usr/src/app
COPY ./requirements.txt /usr/src/app
RUN pip install -r requirements.txt
docker-compose
version: '3' # composeファイルのバージョン
services:
backend:
container_name: backend
build:
context: .
dockerfile: ./build/Dockerfile
volumes:
- ./backend:/usr/src/app
tty: true
environment:
FLASK_APP: apps.app
DEBUG: True
TZ: Asia/Tokyo
ports:
- 5000:5000
working_dir: /usr/src/app
command: bash -c "flask run --host=0.0.0.0"
こんなん準備して、とりあえずFlask環境構築するかー。
といういつものサクサク作るノリでやってみました。
作業内容とログ
実施コマンド
$ docker compose up -d --build
[+] Running 1/1
✔ Container backend Created 0.0s
Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:5000 -> 0.0.0.0:0: listen tcp 0.0.0.0:5000: bind: address already in use
おー。まさかのエラーログ。
5000ポートを誰かが使ってるので犯人探し開始
sudo lsof -P -i:5000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ControlCe 675 gessy0129 8u IPv4 0xee030b0cd4ce567b 0t0 TCP *:5000 (LISTEN)
ControlCe 675 gessy0129 9u IPv6 0xee030b08260f71eb 0t0 TCP *:5000 (LISTEN)
ControlCeって誰・・。
まぁ、見覚えがないCOMMANDかつUSERがPCのユーザー、そして、IPv4とIPv6があるという事は、
・MacのOSが提供してる機能である
・ネットワーク系の機能である
という絞り込みが出来るので、後はググれば問題なし
参考までにググったキーワードは
mac controlcenter port 5000
ググった結果、
このAirPlayレシーバーというヤツが5000番、7000番を使うやつらしい。
そんなん使わないで欲しい。。。
対処方法
このチェックボックスをOFFにすればオッケー
ついでにそれ以外の共有系の設定も見直してます
チェックボックスを外してさえあげれば問題なく起動出来ます。
$ docker compose up -d
[+] Running 1/1
✔ Container backend Started 0.2s
これでとりあえず問題なし。
蛇足
・どうしてもAirPlayレシーバーを使いたい
・Flaskに5000を使って欲しい
という場合は、
Flask起動後にAirPlayレシーバーをONにする
という事をすれば7000番のPortを使ってくれるみたいです。