多阶段 dockerfile 跳过阶段
Multistage dockerfile skip stages
我正在尝试构建具有以下阶段的多阶段 docker 文件,但所有阶段都在执行。
即使我在 docker build
中指定了 EXECUTION_ENV=local
,我总是会执行 git 克隆
Docker文件:
ARG GIT_TOKEN=abc:1a2b3
ARG EXECUTION_ENV=local
# get dependencies from github
FROM alpine/git as gitclone-ci
WORKDIR /usr/src/
RUN git clone https://{GIT_USER_TOKEN}@github.com/something.git \
&& git clone https://{GIT_USER_TOKEN}@github.com/somethingelse.git
## in local dependencies are already available in the parent folder
FROM alpine/git as gitclone-local
WORKDIR /usr/src/
COPY ../something /usr/src/something
COPY ../somethingelse /usr/src/somethingelse
FROM node:latest as builder
WORKDIR /usr/src
COPY --from=gitclone-${EXECUTION_ENV} /usr/src .
COPY package* ./
COPY src/ src/
RUN ["npm", "install"]
Docker 尝试构建命令:
docker build -t somecontainer --build-arg GIT_TOKEN=abc:123 --build-arg EXECUTION_ENV=local.
docker build -t somecontainer --target builder --build-arg GIT_TOKEN=abc:123 --build-arg EXECUTION_ENV=local.
注:
如果我在 docker 守护程序中启用 "features": { "buildkit": true}
并在 cmd docker build -t somecontainer --build-arg GIT_TOKEN=abc:123 --build-arg EXECUTION_ENV=local.
中启用 运行 我会收到以下错误
failed to solve with frontend dockerfile.v0: failed to create LLB definition: failed to parse stage name "gitclone-$EXECUTION_ENV": invalid reference format: repository name must be lowercase
跳过阶段仅适用于 BuildKit。请参阅讨论 here and article here。
至于你得到的错误,你应该在有或没有 BuildKit 的情况下得到它,因为你不能在 COPY
指令中使用构建参数。不同之处在于,使用 BuildKit Docker 甚至会拒绝启动构建,而没有它,构建将在 COPY
指令上失败。
您需要做的是使用 FROM
指令解析构建参数的事实为要复制的图像创建一个额外的别名:
ARG GIT_TOKEN=abc:1a2b3
ARG EXECUTION_ENV=local
# get dependencies from github
FROM alpine/git as gitclone-ci
WORKDIR /usr/src/
RUN git clone https://{GIT_USER_TOKEN}@github.com/something.git \
&& git clone https://{GIT_USER_TOKEN}@github.com/somethingelse.git
## in local dependencies are already available in the parent folder
FROM alpine/git as gitclone-local
WORKDIR /usr/src/
COPY ../something /usr/src/something
COPY ../somethingelse /usr/src/somethingelse
FROM gitclone-${EXECUTION_ENV} as intermediate
FROM node:latest as builder
WORKDIR /usr/src
COPY --from=intermediate /usr/src .
COPY package* ./
COPY src/ src/
RUN ["npm", "install"]
我正在尝试构建具有以下阶段的多阶段 docker 文件,但所有阶段都在执行。
即使我在 docker build
中指定了EXECUTION_ENV=local
,我总是会执行 git 克隆
Docker文件:
ARG GIT_TOKEN=abc:1a2b3
ARG EXECUTION_ENV=local
# get dependencies from github
FROM alpine/git as gitclone-ci
WORKDIR /usr/src/
RUN git clone https://{GIT_USER_TOKEN}@github.com/something.git \
&& git clone https://{GIT_USER_TOKEN}@github.com/somethingelse.git
## in local dependencies are already available in the parent folder
FROM alpine/git as gitclone-local
WORKDIR /usr/src/
COPY ../something /usr/src/something
COPY ../somethingelse /usr/src/somethingelse
FROM node:latest as builder
WORKDIR /usr/src
COPY --from=gitclone-${EXECUTION_ENV} /usr/src .
COPY package* ./
COPY src/ src/
RUN ["npm", "install"]
Docker 尝试构建命令:
docker build -t somecontainer --build-arg GIT_TOKEN=abc:123 --build-arg EXECUTION_ENV=local.
docker build -t somecontainer --target builder --build-arg GIT_TOKEN=abc:123 --build-arg EXECUTION_ENV=local.
注:
如果我在 docker 守护程序中启用 "features": { "buildkit": true}
并在 cmd docker build -t somecontainer --build-arg GIT_TOKEN=abc:123 --build-arg EXECUTION_ENV=local.
中启用 运行 我会收到以下错误
failed to solve with frontend dockerfile.v0: failed to create LLB definition: failed to parse stage name "gitclone-$EXECUTION_ENV": invalid reference format: repository name must be lowercase
跳过阶段仅适用于 BuildKit。请参阅讨论 here and article here。
至于你得到的错误,你应该在有或没有 BuildKit 的情况下得到它,因为你不能在 COPY
指令中使用构建参数。不同之处在于,使用 BuildKit Docker 甚至会拒绝启动构建,而没有它,构建将在 COPY
指令上失败。
您需要做的是使用 FROM
指令解析构建参数的事实为要复制的图像创建一个额外的别名:
ARG GIT_TOKEN=abc:1a2b3
ARG EXECUTION_ENV=local
# get dependencies from github
FROM alpine/git as gitclone-ci
WORKDIR /usr/src/
RUN git clone https://{GIT_USER_TOKEN}@github.com/something.git \
&& git clone https://{GIT_USER_TOKEN}@github.com/somethingelse.git
## in local dependencies are already available in the parent folder
FROM alpine/git as gitclone-local
WORKDIR /usr/src/
COPY ../something /usr/src/something
COPY ../somethingelse /usr/src/somethingelse
FROM gitclone-${EXECUTION_ENV} as intermediate
FROM node:latest as builder
WORKDIR /usr/src
COPY --from=intermediate /usr/src .
COPY package* ./
COPY src/ src/
RUN ["npm", "install"]