docker - Dockerfile if else condition with external arguments - Stack Overflow Dockerfile 内で条件に応じて処理を変えたかったので試行錯誤したメモ - ようへいの日々精進XP

前提として、Dockerfile内で制御構文は使えない。使わずシンプルにするっていう思想になっている

1. shell scriptで分岐

FROM centos:7
ARG arg
RUN if [[ -z "$arg" ]] ; then echo Argument not provided ; else echo Argument is $arg ; fi

これだとshell内でできることは分岐できるがCOPYなどDockerfile内のコマンドには使えない。

2. マルチステージビルドを使う

ARG my_arg
 
FROM centos:7 AS base
RUN echo "do stuff with the centos image"
 
FROM base AS branch-version-1
RUN echo "this is the stage that sets VAR=TRUE"
ENV VAR=TRUE
 
FROM base AS branch-version-2
RUN echo "this is the stage that sets VAR=FALSE"
ENV VAR=FALSE
 
FROM branch-version-${my_arg} AS final
RUN echo "VAR is equal to ${VAR}"

docker build -t my_docker . --build-arg my_arg=2

baseを基準のイメージとして、複数種類のstageを定義してglobalなARGでstage名を指定する

2’. targetを指定する

--build-arg で指定するのではなく、マルチステージビルドの --target で指定する方法。こちらのほうがtargetが明確になっていいと思った。

FROM foo as base
RUN ...
WORKDIR /opt/my-proj
 
FROM base as npm-ci-dev
# invalidate cache
COPY --chown=www-data:www-data ./package.json /opt/my-proj/package.json
COPY --chown=www-data:www-data ./package-lock.json /opt/my-proj/package-lock.json
RUN npm ci
 
FROM base as npm-ci-prod
# invalidate cache
COPY --chown=www-data:www-data ./package.json /opt/my-proj/package.json
COPY --chown=www-data:www-data ./package-lock.json /opt/my-proj/package-lock.json
RUN npm ci --only=prod
 
FROM base as proj-files
COPY --chown=www-data:www-data ./ /opt/my-proj
 
FROM base as image-dev
# Will mount, not copy in dev environment
RUN ...
 
FROM base as image-ci
COPY --from=npm-ci-dev /opt/my-proj .
COPY --from=proj-files /opt/my-proj .
RUN ...
 
FROM base as image-stage
COPY --from=npm-ci-prod /opt/my-proj .
COPY --from=proj-files /opt/my-proj .
RUN ...
 
FROM base as image-prod
COPY --from=npm-ci-prod /opt/my-proj .
COPY --from=proj-files /opt/my-proj .
RUN ...

docker build --target image-dev -t foo .