ジャコ Lab

プログラミング関連のメモ帳的ブログです

Dockerfile 作ってるときってとりあえずコンテナを起動しっぱなしにしたいよね

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 難しい