やや複雑な構造を持つディレクトリにおける compose+Dockerfile の書き方でハマった話

Sota Masuda


Sota Masuda
#dev#docker
この記事の概要
- 本格的なプロダクト開発環境において
Dockerfile
とdocker-compose.yml
を記述するときは、細かい仕様をよく理解していないとハマる - 今回はDockerのビルドコンテキストという概念を正しく理解していなかったためにハマった話を記述する
Note
こういうフォルダ構成
grpc-services/
- services-1/
- microservice-a/
- docker/Dockerfile
- (*.py)
- run-server.sh
- microservice-b/
- docker/Dockerfile
- (*.py)
- run-server.sh
microservice-controller/
- docker/Dockerfile
- (*.py)
- run-server.sh
protos/
- ms-proto/
- xxxx.proto
- build.sh
- clean.sh
docker-compose.yml
docker-compose.yml の build セクション書くときのヒント
docker-compose.ymlのbuild設定はとりあえずcontextもdockerfileも埋めとけって話 - Qiita
Dockerfileを記述するときは、 docker-compose.ym の services.service.build.context で記載した箇所がカレントディレクトリと考えてCOPYコマンドなどを記述する。
結論こうなった
version: "3"
services:
microservice-controller:
build:
context: .
dockerfile: ./microservice_controller/docker/Dockerfile
microservice-a:
build:
context: .
dockerfile: ./grpc-services/services-1/microservice-a/docker/Dockerfile
microservice-b:
build:
context: .
dockerfile: ./grpc-services/services-1/microservice-b/docker/Dockerfile
FROM python:3.9-buster as build
RUN apt-get -y update && apt-get -y install python3 python3-pip
RUN pip install grpcio-tools==1.41.0 python-json-logger==2.0.1
COPY ./protos /protos
WORKDIR /protos
RUN ./build.sh
WORKDIR /
COPY ./microservice_controller /app
RUN cp -r /protos/gen-py /app
WORKDIR /app
CMD ["./run-server.sh"]
FROM python:3.9-buster as build
RUN apt-get -y update && apt-get -y install python3 python3-pip
RUN pip install grpcio-tools==1.41.0 python-json-logger==2.0.1 datadog==0.41.0
COPY ./protos /protos
WORKDIR /protos
RUN ./build.sh
WORKDIR /
COPY ./grpc-services/services-1/microservice-a/ /app
RUN cp -r /protos/gen-py /app
WORKDIR /app
CMD ["/app/run-server.sh"]
あと、直接的には関係ないけど、改善した項目として ADD
—> COPY
に変えた
以下参考
DockerfileにてなぜADDよりCOPYが望ましいのか - Qiita
更に、今回の話とは直接関係ないけど、以下を参照して突貫工事で作ったDockerfileを見直したい
特に、不用意にイメージが肥大化していそうなところ、共通化すべきところを共通化できていないところなど