FROM python:3.11.10-slim-bullseye WORKDIR /app COPY ./app . ENTRYPOINT ["python", "app/main.py"]
例えば、main.py が動かなかったときにコンテナに潜ってどういう構成になっているか見たいですよね
Dockerfile & docker-compose.yml
FROM python:3.11.10-slim-bullseye WORKDIR /app COPY ./app . ENTRYPOINT ["python", "app/main.py"]
services: app: build: context: . container_name: app
コンテナ起動
$ docker compose up [+] Running 1/0 ✔ Container app Created 0.0s Attaching to app app | python: can't open file '/app/app/main.py': [Errno 2] No such file or directory app exited with code 2 $ docker compose ps NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
例えばこのようにコンテナが落ちてしまったら何が足りないのかわからないです
そんなときは tty: true
FROM python:3.11.10-slim-bullseye WORKDIR /app COPY ./app . - ENTRYPOINT ["python", "app/main.py"] + #ENTRYPOINT ["python", "app/main.py"]
この状態だと ただ、何もせずにコンテナは終了 してしまいますが、
docker-compose.yml に tty: true
を付けることで コンテナを起動しっぱなしにすることができる ようです。
services:
app:
build:
context: .
container_name: app
+ tty: true
コンテナを起動してみる
[ターミナル1] $ docker compose up --build ~省略~ ✔ Container app Recreated 0.2s Attaching to app app | Python 3.11.10 (main, Sep 12 2024, 21:09:22) [GCC 10.2.1 20210110] on linux app | Type "help", "copyright", "credits" or "license" for more information.
[ターミナル2] $ docker compose ps NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS app my_app-app "python3" app 6 seconds ago Up 6 seconds
これならコンテナに潜れる~~
コンテナに潜って確認してみる
$ docker compose exec app bash root@f6838782a547:/app# ls -la total 12 drwxr-xr-x 1 root root 4096 Sep 26 13:38 . drwxr-xr-x 1 root root 4096 Sep 26 13:44 .. -rw-rw-r-- 1 root root 79 Sep 26 13:38 main.py
おや?
app/main.py
になってない
ということは COPY
に誤りがあるということですね。
app ディレクトリをコピーしたつもりが app ディレクトリの中身がコピー されてしまってます。
Dockerfile を修正
FROM python:3.11.10-slim-bullseye WORKDIR /app - COPY ./app . + COPY ./app ./app # ENTRYPOINT ["python", "app/main.py"]
再確認
[ターミナル1] $ docker compose up --build ~省略~ ✔ Container app Recreated 0.2s Attaching to app app | Python 3.11.10 (main, Sep 12 2024, 21:09:22) [GCC 10.2.1 20210110] on linux app | Type "help", "copyright", "credits" or "license" for more information.
[ターミナル2] $ docker compose exec app bash root@0dd71dfd2da0:/app# ls -la total 12 drwxr-xr-x 1 root root 4096 Sep 26 13:46 . drwxr-xr-x 1 root root 4096 Sep 26 13:46 .. drwxr-xr-x 2 root root 4096 Sep 26 13:38 app root@0dd71dfd2da0:/app# ls -la app/ total 12 drwxr-xr-x 2 root root 4096 Sep 26 13:38 . drwxr-xr-x 1 root root 4096 Sep 26 13:46 .. -rw-rw-r-- 1 root root 79 Sep 26 13:38 main.py
いい感じでは?
最終確認
FROM python:3.11.10-slim-bullseye WORKDIR /app COPY ./app ./app - #ENTRYPOINT ["python", "app/main.py"] + ENTRYPOINT ["python", "app/main.py"]
$ docker compose up --build ~省略~ ✔ Container app Recreated 0.1s Attaching to app app | START : main() app exited with code 0
お!無事に
app/main.py
が実行できている!
今回は app/main.py
はただの、print 文が書いてあるスクリプトでしたが、
FastAPI などの Web サーバー等を起動するときなどに実用的ですね!
まとめ
Docker 難しい