Moby: рдИрдПрдирдПрд╕рд╡реА рдФрд░ рдПрдЖрд░рдЬреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдорд▓реНрдЯреА-рд╕реНрдЯреЗрдЬ рдмрд┐рд▓реНрдб рдореЗрдВ рд╕рднреА рдмрд╛рдж рдХреЗ рдЪрд░рдгреЛрдВ рдореЗрдВ рдЬрд╛рд░реА рд░рдЦрдирд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 26 рдЬреВрди 2018  ┬╖  20рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: moby/moby

рд╡рд┐рд╡рд░рдг

Afaik, рдЪрд░рдгреЛрдВ рдХреЗ рдмреАрдЪ рдЪрд░ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ (рдпрджрд┐ рдореБрдЭреЗ рдЧрд▓рдд рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рд╕рд╣реА рдХрд░реЗрдВ)ред рдПрдХ рдирд┐рд░реНрдорд╛рдг рдЪрд░рдг рд╕реЗ рджреВрд╕рд░реЗ рдЪрд░рдг рддрдХ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдордВрдЪ рдХреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ рд╡рд░реНрддрдорд╛рди рдЪрд░рдг рддрдХ COPY рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рд╡рд┐рдХрд▓реНрдк рд╣реИред рд╣рдо рдмрд┐рд▓реНрдб-рдЯрд╛рдЗрдо рд╡реИрд░рд┐рдПрдмрд▓ рдХреЗ рдбрдВрдк рдХреЗ рд╕рд╛рде JSON рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рддрд░рд╣ рдХреБрдЫ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдмрд╣реБрдд рд╣реА рд▓рдЧрд╛рддрд╛рд░ рд╣реИ, рдФрд░ рдпрд╣ рд╣рдорд╛рд░реЗ рдорд▓реНрдЯреА-рд╕реНрдЯреЗрдЬ рдмрд┐рд▓реНрдб рдХреЛ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд╛рдЧрд▓ JSON рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдореБрджреНрджреЛрдВ рдХреЗ рд╕рд╛рде рдмрд╛рдврд╝ рджреЗрдЧрд╛ред рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрджрдо:

FROM alpine:latest as base1
ARG v1=test
ENV v1=$v1
RUN echo ${v1}

FROM alpine:latest as base2
RUN echo ${v1}

рдЖрдкрдХреЛ рдкреНрд░рд╛рдкреНрдд рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ:

docker build --no-cache  .
Step 4/6 : RUN echo ${v1}
---> Running in b60a3079864b
test

...

Step 5/6 : FROM alpine:latest as base2
---> 3fd9065eaf02
Step 6/6 : RUN echo ${v1}
---> Running in 1147977afd60

рдЕрдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо рдмрддрд╛рдПрдВ:

docker build --no-cache --multistage-share-env --multistage-share-arg .
Step 4/6 : RUN echo ${v1}
---> Running in b60a3079864b
test

...

Step 5/6 : FROM alpine:latest as base2
---> 3fd9065eaf02
Step 6/6 : RUN echo ${v1}
---> Running in 1147977afd60
test

рдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо ${base1.v1} рдХреЛ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╛рдорд╕реНрдерд╛рди рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

arebuilder kinquestion

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

ENV var рдФрд░ ARG рд╕рд╣рд┐рдд рд╕рд╣реА, Dockerfile рдирд┐рд░реНрджреЗрд╢ рдмрд┐рд▓реНрдб-рд╕реНрдЯреЗрдЬ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмрдВрдж рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдЧрд▓реЗ рдЪрд░рдг рдореЗрдВ рд╕рдВрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ; рдпрд╣ рдбрд┐рдЬрд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рд╣реИред

рдЖрдк _can_, рд╣рд╛рд▓рд╛рдВрдХрд┐, _global_ ARG (рдкрд╣рд▓реЗ рдмрд┐рд▓реНрдб-рд╕реНрдЯреЗрдЬ рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗрдЯ) рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рд▓реНрдб-рд╕реНрдЯреЗрдЬ рдореЗрдВ рдЙрд╕ рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ;

ARG version_default=v1

FROM alpine:latest as base1
ARG version_default
ENV version=$version_default
RUN echo ${version}
RUN echo ${version_default}

FROM alpine:latest as base2
ARG version_default
RUN echo ${version_default}

--build-arg рд╕реЗрдЯ рдХреЗ рдмрд┐рдирд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп;

docker build --no-cache -<<'EOF'
ARG version_default=v1

FROM alpine:latest as base1
ARG version_default
ENV version=$version_default
RUN echo ${version}
RUN echo ${version_default}

FROM alpine:latest as base2
ARG version_default
RUN echo ${version_default}
EOF

рдпрд╣ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИ:

Sending build context to Docker daemon  2.048kB
Step 1/9 : ARG version_default=v1
Step 2/9 : FROM alpine:latest as base1
 ---> 3fd9065eaf02
Step 3/9 : ARG version_default
 ---> Running in 702c05d6f294
Removing intermediate container 702c05d6f294
 ---> 1b2cac6e7585
Step 4/9 : ENV version=$version_default
 ---> Running in 6fb73bc8cdb9
Removing intermediate container 6fb73bc8cdb9
 ---> 656d82ccb6d7
Step 5/9 : RUN echo ${version}
 ---> Running in 403c720d0031
v1
Removing intermediate container 403c720d0031
 ---> d6071c5bd329
Step 6/9 : RUN echo ${version_default}
 ---> Running in d5c76d7d3aaa
v1
Removing intermediate container d5c76d7d3aaa
 ---> 554df1d8584b
Step 7/9 : FROM alpine:latest as base2
 ---> 3fd9065eaf02
Step 8/9 : ARG version_default
 ---> Running in 92400e85c722
Removing intermediate container 92400e85c722
 ---> 5f0cb12f4448
Step 9/9 : RUN echo ${version_default}
 ---> Running in f38802f0d690
v1
Removing intermediate container f38802f0d690
 ---> 4b8caab7870a
Successfully built 4b8caab7870a

рдФрд░ _with_ a --build-arg ;

docker build --no-cache --build-arg version_default=v2 -<<'EOF'
ARG version_default=v1

FROM alpine:latest as base1
ARG version_default
ENV version=$version_default
RUN echo ${version}
RUN echo ${version_default}

FROM alpine:latest as base2
ARG version_default
RUN echo ${version_default}
EOF
Sending build context to Docker daemon  2.048kB
Step 1/9 : ARG version_default=v1
Step 2/9 : FROM alpine:latest as base1
 ---> 3fd9065eaf02
Step 3/9 : ARG version_default
 ---> Running in 7f5dd5885859
Removing intermediate container 7f5dd5885859
 ---> 482ffb014095
Step 4/9 : ENV version=$version_default
 ---> Running in b6c6e9aa3489
Removing intermediate container b6c6e9aa3489
 ---> 83f1c0b82986
Step 5/9 : RUN echo ${version}
 ---> Running in 0805ec04fd20
v2
Removing intermediate container 0805ec04fd20
 ---> ef39d4bd6306
Step 6/9 : RUN echo ${version_default}
 ---> Running in f8747a5bfeeb
v2
Removing intermediate container f8747a5bfeeb
 ---> 72d497d25306
Step 7/9 : FROM alpine:latest as base2
 ---> 3fd9065eaf02
Step 8/9 : ARG version_default
 ---> Running in 57aa2e097787
Removing intermediate container 57aa2e097787
 ---> 45e167d234ce
Step 9/9 : RUN echo ${version_default}
 ---> Running in 8615cd6f6ab6
v2
Removing intermediate container 8615cd6f6ab6
 ---> 1674ad8d3b88
Successfully built 1674ad8d3b88

рд╕рднреА 20 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ENV var рдФрд░ ARG рд╕рд╣рд┐рдд рд╕рд╣реА, Dockerfile рдирд┐рд░реНрджреЗрд╢ рдмрд┐рд▓реНрдб-рд╕реНрдЯреЗрдЬ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмрдВрдж рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдЧрд▓реЗ рдЪрд░рдг рдореЗрдВ рд╕рдВрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ; рдпрд╣ рдбрд┐рдЬрд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рд╣реИред

рдЖрдк _can_, рд╣рд╛рд▓рд╛рдВрдХрд┐, _global_ ARG (рдкрд╣рд▓реЗ рдмрд┐рд▓реНрдб-рд╕реНрдЯреЗрдЬ рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗрдЯ) рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рд▓реНрдб-рд╕реНрдЯреЗрдЬ рдореЗрдВ рдЙрд╕ рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ;

ARG version_default=v1

FROM alpine:latest as base1
ARG version_default
ENV version=$version_default
RUN echo ${version}
RUN echo ${version_default}

FROM alpine:latest as base2
ARG version_default
RUN echo ${version_default}

--build-arg рд╕реЗрдЯ рдХреЗ рдмрд┐рдирд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп;

docker build --no-cache -<<'EOF'
ARG version_default=v1

FROM alpine:latest as base1
ARG version_default
ENV version=$version_default
RUN echo ${version}
RUN echo ${version_default}

FROM alpine:latest as base2
ARG version_default
RUN echo ${version_default}
EOF

рдпрд╣ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИ:

Sending build context to Docker daemon  2.048kB
Step 1/9 : ARG version_default=v1
Step 2/9 : FROM alpine:latest as base1
 ---> 3fd9065eaf02
Step 3/9 : ARG version_default
 ---> Running in 702c05d6f294
Removing intermediate container 702c05d6f294
 ---> 1b2cac6e7585
Step 4/9 : ENV version=$version_default
 ---> Running in 6fb73bc8cdb9
Removing intermediate container 6fb73bc8cdb9
 ---> 656d82ccb6d7
Step 5/9 : RUN echo ${version}
 ---> Running in 403c720d0031
v1
Removing intermediate container 403c720d0031
 ---> d6071c5bd329
Step 6/9 : RUN echo ${version_default}
 ---> Running in d5c76d7d3aaa
v1
Removing intermediate container d5c76d7d3aaa
 ---> 554df1d8584b
Step 7/9 : FROM alpine:latest as base2
 ---> 3fd9065eaf02
Step 8/9 : ARG version_default
 ---> Running in 92400e85c722
Removing intermediate container 92400e85c722
 ---> 5f0cb12f4448
Step 9/9 : RUN echo ${version_default}
 ---> Running in f38802f0d690
v1
Removing intermediate container f38802f0d690
 ---> 4b8caab7870a
Successfully built 4b8caab7870a

рдФрд░ _with_ a --build-arg ;

docker build --no-cache --build-arg version_default=v2 -<<'EOF'
ARG version_default=v1

FROM alpine:latest as base1
ARG version_default
ENV version=$version_default
RUN echo ${version}
RUN echo ${version_default}

FROM alpine:latest as base2
ARG version_default
RUN echo ${version_default}
EOF
Sending build context to Docker daemon  2.048kB
Step 1/9 : ARG version_default=v1
Step 2/9 : FROM alpine:latest as base1
 ---> 3fd9065eaf02
Step 3/9 : ARG version_default
 ---> Running in 7f5dd5885859
Removing intermediate container 7f5dd5885859
 ---> 482ffb014095
Step 4/9 : ENV version=$version_default
 ---> Running in b6c6e9aa3489
Removing intermediate container b6c6e9aa3489
 ---> 83f1c0b82986
Step 5/9 : RUN echo ${version}
 ---> Running in 0805ec04fd20
v2
Removing intermediate container 0805ec04fd20
 ---> ef39d4bd6306
Step 6/9 : RUN echo ${version_default}
 ---> Running in f8747a5bfeeb
v2
Removing intermediate container f8747a5bfeeb
 ---> 72d497d25306
Step 7/9 : FROM alpine:latest as base2
 ---> 3fd9065eaf02
Step 8/9 : ARG version_default
 ---> Running in 57aa2e097787
Removing intermediate container 57aa2e097787
 ---> 45e167d234ce
Step 9/9 : RUN echo ${version_default}
 ---> Running in 8615cd6f6ab6
v2
Removing intermediate container 8615cd6f6ab6
 ---> 1674ad8d3b88
Successfully built 1674ad8d3b88

рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рдХрдИ рдЪрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдмреЗрд╕ рдХрдВрдЯреЗрдирд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ:

FROM alpine:latest as base
ARG version_default
ENV version=$version_default

FROM base
RUN echo ${version}

FROM base
RUN echo ${version}
docker build --build-arg=version_default=123 --no-cache .   
Sending build context to Docker daemon  92.67kB
Step 1/7 : FROM alpine:latest as base
 ---> 3fd9065eaf02
Step 2/7 : ARG version_default
 ---> Running in a1ebfdf79f07
Removing intermediate container a1ebfdf79f07
 ---> 3e78800ed9ea
Step 3/7 : ENV version=$version_default
 ---> Running in 105d94baac3f
Removing intermediate container 105d94baac3f
 ---> a14276ddc77b
Step 4/7 : FROM base
 ---> a14276ddc77b
Step 5/7 : RUN echo ${version}
 ---> Running in d92f9b48a6cc
123
Removing intermediate container d92f9b48a6cc
 ---> 6505fe2a14bb
Step 6/7 : FROM base
 ---> a14276ddc77b
Step 7/7 : RUN echo ${version}
 ---> Running in 1b748eea4ef3
123
Removing intermediate container 1b748eea4ef3
 ---> f3311d3ad27e
Successfully built f3311d3ad27e
Time: 0h:00m:04s

рдореБрдЭреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рджреЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдбрд┐рдЬрд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдЖрдкрдХреЛ рдЖрдЧреЗ рдорджрдж рдХрд░рддреЗ рд╣реИрдВ; рдмрд╛рддрдЪреАрдд рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ

рдпрджрд┐ рдпрд╣ рдбрд┐рдЬрд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рд╣реИ, рддреЛ рдбрд┐рдЬрд╛рдЗрди рдЧрд▓рдд рд╣реИред рдЪрд░рдгреЛрдВ рдХреЗ рдмреАрдЪ рдЪрд░ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рддрд░реАрдХреЗ рдХреЗ рдмрд┐рдирд╛ рдпрд╣ DRY рдЕрд╕рдВрднрд╡ рд╣реИред рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп, рдЕрд╕рд╛рдордпрд┐рдХ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рд╣реИрдВ рдЬрд╣рд╛рдВ рдХрдИ рдЪрд░рдгреЛрдВ рдХреЛ рд╕рдорд╛рди рдЪрд░ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдбреБрдкреНрд▓рд┐рдХреЗрдЯрд┐рдВрдЧ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╡рдг рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдореЗрдВ рд╕рд╛рдЭрд╛ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ рд╣реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░ рд░рд╣рд╛ рд╣реИред

"рдмреЗрд╕ рдХрдВрдЯреЗрдирд░" рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЧрдВрднреАрд░ рд░реВрдк рд╕реЗ рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рд╢рдХреНрддрд┐ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдХреЗ рд▓рд┐рдП рдмреЗрд╕ рдХрдВрдЯреЗрдирд░ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рд╡реИрдз рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдордзреНрдпрд╡рд░реНрддреА рдЪрд░рдг рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдиреНрдпреВрдирддрдо рдЖрдзрд╛рд░ рдЫрд╡рд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдЪрд░рдг рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЙрдкрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

@ рддрдЬрдЬрдордд
рдХреНрдпрд╛ рдЗрд╕ рдбрд┐рдЬрд╛рдЗрди рдкрд░ рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рдореЗрд░реЗ рдкрд╛рд╕ 11 рдЖрдзрд╛рд░ рдЪрд┐рддреНрд░ рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ рдФрд░ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╣рдорд╛рд░реЗ рд╡рд┐рднрд┐рдиреНрди рдмрд┐рд▓реНрдб рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдореИрдВ рдПрдХ рдЖрдзрд╛рд░ "рдЦрд░реЛрдВрдЪ рд╕реЗ" рдЫрд╡рд┐ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдХрд┐ рд╡реЗ 11 рдЫрд╡рд┐рдпрд╛рдВ рдПрдХ рдореБрд▓рд┐рдЯ-рд╕реНрдЯреЗрдЬ рдмрд┐рд▓реНрдб рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рддрд░реНрдХ рд╕рднреА 11 рдореЗрдВ рд╕рдорд╛рди рд╣реИрдВ, рдФрд░ рдЗрд╕рдореЗрдВ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рдкрд╛рд╕ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЫрд╡рд┐ рдХреЗ рднреАрддрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЗрдиреНрд╣реЗрдВ рдЕрдкрдиреА рдЖрдзрд╛рд░ рдЫрд╡рд┐ рдХреЗ рднреАрддрд░ рд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рд░ рджреВрд╕рд░реЗ рдЫрд╡рд┐ рдореЗрдВ рд╕рдорд╛рди рддрд░реНрдХ рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛред

@ DMaxfield-BDS ARG рдХрд╛ рд╕реНрдХреЛрдк рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЖрдк рдПрдХ рдЕрд▓рдЧ рдмрд┐рд▓реНрдб рд▓рдХреНрд╖реНрдп рдмрдирд╛рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ "FROM рд╕реНрдХреНрд░реИрдЪ" рдмреЗрд╕ рдЗрдореЗрдЬ рдмрдирд╛рддрд╛ рд╣реИ; рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреЛ рдзрдХреНрдХрд╛ рджреЗрдВ, рдФрд░ рдпрджрд┐ рдЖрдкрдХреА рдЕрдиреНрдп рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ;

FROM scratch AS scratch-base
ENV foo=bar
ENV bar=baz

рдЗрд╕реЗ рдмрдирд╛рдПрдБ, рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреА (рдЖрдВрддрд░рд┐рдХ) рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдкрд░ рдзрдХреЗрд▓реЗрдВ, рдФрд░ рд╡реЗ 11 рдЖрдзрд╛рд░ рдЪрд┐рддреНрд░ рдЗрд╕реЗ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

FROM scratch-base
RUN your stuff

EXPORT/IMPORT рд╣реЛрдиреЗ рдХрд╛ рдПрдХ рдФрд░ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ, рдЬреЛ рдХреБрдЫ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдлрд┐рдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ; https://github.com/moby/moby/issues/32100

@ рддрдЬрдЬрддрд╣

рдЖрдкрдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдПрдХ рдмрд╛рдд рдЬреЛ рдореИрдВрдиреЗ рдирд╣реАрдВ рдмрддрд╛рдИ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЗрди 11 рдЕрдиреНрдп рдЫрд╡рд┐рдпреЛрдВ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЖрдзрд╛рд░ рдЪрд┐рддреНрд░ (рдЕрдЬрдЧрд░, рдПрдирдкреАрдПрдо, рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ, рдУрдкрдирдЬреНрдбрдХ, рдЖрджрд┐) рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЬреЛ рдХрд░рдирд╛ рдЪрд╛рд╣ рд░рд╣рд╛ рд╣реВрдВ, рд╡рд╣ рд╕рднреА рдЖрдо рд╕реЗрдЯ-рдЕрдк / рдкреНрд░реАрдк рдХреЛ рдПрдХ рдмреЗрд╕ рдЗрдореЗрдЬ рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдореЗрд░реА рдХрдВрдкрдирд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЛ рд╕реЗрдЯ рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреИрд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд:

FROM scratch AS scratch-base
ARG JAR_DIR='/Input/jars/'
ENV JAR_DOWNLOAD_DIR=$JAR_DIR

рдореЗрд░реА рдЖрдВрддрд░рд┐рдХ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдкрд░ рдкреБрд╢ рдХрд░реЗрдВред рдлрд┐рд░, рдЕрдиреНрдп 11 рдЫрд╡рд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реЛрдЧрд╛:

FROM scratch-base AS scratch-base
FROM openjdk:8-jdk
COPY --from=scratch-base $JAR_DOWNLOAD_DIR .
RUN <stuff that also uses the JAR_DOWNLOAD_DIR environment variable>

рдЕрдЧрд░ рдореИрдВ рдкрд╣рд▓реА рдЫрд╡рд┐ рдореЗрдВ рд╕реЗрдЯ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рдЕрдиреНрдп 11 рдЫрд╡рд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдЗрди рд╕рдорд╛рди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдореБрдЭреЗ рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрд┐рдВрджреБ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдмреЗрд╣рддрд░ рд╕реНрд╡рдЪрд╛рд▓рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдореИрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреИрд╕реЗ рдХреБрдЫ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реВрдВ?

RUN COMMIT_HASH = $ (git Rev-parse --short HEAD)

рдмрд╛рдж рдХреЗ RUN рдЪрд░рдгреЛрдВ рдореЗрдВ рдореБрдЭреЗ COMMIT_HASH рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдХреИрд╕реЗ рджреА рдЬрд╛рддреА рд╣реИ? рдореИрдВ рдЪрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рдПрдХ рдЪрд░рдг рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд╣реВрдВ?

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдпрд╣ рдбрд┐рдЬрд╛рдЗрди рдмрд╣реБрдд рд╕реАрдорд┐рдд рд╣реИред рд╢рд╛рдпрдж рдХреЛрдИ рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

RUN COMMIT_HASH = $ (git Rev-parse --short HEAD) AS- рд╣реИрд╢
ARG --from = рдкреНрд░рддрд┐рдмрджреНрдз-рд╣реИрд╢ COMMIT_HASH
RUN рдЧреВрдВрдЬ $ {COMMIT_HASH}

@ dnk8n рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдореИрдВ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ:

рдмрд┐рд▓реНрдб рд╕реНрдЯреЗрдЬ рдкрд░ рдореИрдВ:

RUN git rev-parse HEAD > commit_hash

рдлрд┐рд░ рджреВрд╕рд░реЗ рдЪрд░рдг рдореЗрдВ рдореИрдВ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддрд╛ рд╣реВрдВ рдФрд░ рдЕрдкрдиреЗ рдРрдк рдХреЛ рдЪрд▓рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЛ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдЗрд╕рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рддрд╛ рд╣реИ:

COPY --from=builder /<build_folder>/commit_hash /<other_stage_folder>/commit_hash

CMD export COMMIT_HASH=$(cat /<other_stage_folder>/commit_hash); java -jar myApp.jar

рдЖрдкрдХреЛ ARG рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдорд╛рди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдмрд╣реБрдд рдХрдо рд╕реЗ рдХрдо рд╣рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдХреБрдЫ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рджреВрд╕рд░реЗ рдЪрд░рдг / рдЫрд╡рд┐ рд╕реЗ BAR рдЪрд░ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рд╡рд░реНрддрдорд╛рди рдмрд┐рд▓реНрдб рд╕реНрдХреЛрдк рдореЗрдВ рдмрдирд╛рдИ рдЬрд╛ рд╕рдХреЗред

ENV --from=stage1 FOO=$BAR

рдПрдХ рдмрд╛рд╣рд░реА рдЫрд╡рд┐ рдХреЛ рдПрдХ рдордВрдЪ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдФрд░ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

ENV --from=nginx:latest FOO=$BAR

рдореИрдВ рдЗрд╕ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЛ рдмрдЪрд╛рдХрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

FROM base1:version1 AS BUILDER1
WORKDIR /build
RUN env | sort > env.BUILDER1

FROM base2:version2 AS BUILDER2
WORKDIR /build
RUN env | sort > env.BUILDER2

FROM finalbase:version AS FINAL
WORKDIR /build
ENV LANG=C.UTF-8
COPY --from=BUILDER1 /build/env.BUILDER1 .
COPY --from=BUILDER2 /build/env.BUILDER2 .
# Use ". ./env.BUILDER" instead of "source" if /bin/sh is true-POSIX
RUN set -eux ; \
        source ./env.BUILDER1 ; \
        source ./env.BUILDER2 ; \
        env | sort

рдХрд┐ рдЕрдВрдд рдореЗрдВ 'рдбреЙрдХрдЯрд░' рдореЗрдВ 'рд╕реЗрд╡' рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ docker inspect рдореИрдВ рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛрдиреЗ рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП / etc / рдкреНрд░реЛрдлрд╛рдЗрд▓ рдореЗрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

image

рдкрд┐рдЫрд▓реЗ рдЯрд┐рдкреНрдкрдгреА рдЗрддрдиреА рддрд╛рдЬрд╝рд╛ рд░рд╣реА, рдХреЗрд╡рд▓ рдореБрдЭреЗ рдЗрд╕ рдмрд╛рдд рдкрд░ рдПрдХ рдЭрд▓рдХ рдорд┐рд▓рддреА рд╣реИ рдХрд┐ рдбреЙрдХрдлрд╛рдЗрд▓ рдХреЗ рдкреАрдЫреЗ рдХрд┐рддрдиреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рдлреИрд╕рд▓реЛрдВ рдкрд░ рд╕рд╡рд╛рд▓ рдЙрдард╛ рд░рд╣реЗ рд╣реИрдВред рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ "DRY" рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреМрд╢рд▓реЛрдВ рдореЗрдВ рд╕реЗ рдирд╣реАрдВ рдерд╛ред рдпрджрд┐ рдЖрдк рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдФрд░ рдкрд░рдд рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдбреЙрдХрдлрд╛рдЗрд▓реНрд╕ рдХреЛ рдЕрд╕реНрдерд╛рдпреА рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ ...

рд╕рдЪ рдХрд╣реВрдВ рддреЛ рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╣реИрд░рд╛рди рд╣реВрдВ ... "рдЧреНрд▓реЛрдмрд▓ рдПрд░реНрдЧ" рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЕрдЧрд░ рдореИрдВ рдмрд┐рд▓реНрдб рдЖрд░реНрдЧ рдХреЛ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬ рд╕реЗ рдкрд╣рд▓реЗ рдКрдкрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реВрдВ, рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ FROM рдХреЗ рдмрд╛рдж рдХреЗ рдЪрд░рдгреЛрдВ рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдореБрдЭреЗ рдПрдЖрд░рдЬреА рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ FROM рдХреЗ рдмрд╛рдж рдХрд┐рд╕реА рднреА рдорд╛рди рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рджреЛрд╣рд░рд╛рдирд╛ рд╣реЛрдЧрд╛ ... рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЖрджрд░реНрд╢ рдирд╣реАрдВред

рджреВрд╕рд░реЗ рдЪрд░рдг рд╕реЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреА рдирдХрд▓ (рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛) рдХрд╛ рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХрд╛ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡реИрдз рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИред
рдпрд╣рд╛рдБ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

FROM node:lts-alpine AS node
FROM php:7-fpm-alpine AS php

# Here goes some build instructions for PHP image, then

# Install nodejs, npm, yarn
COPY --from=node /usr/local/bin/node /usr/local/bin/node
COPY --from=node /usr/local/lib/node_modules /usr/local/lib/node_modules
COPY --from=node /opt /opt

# Create symlinks to npm, yarn binaries
RUN \
    ln -s "/usr/local/lib/node_modules/npm/bin/npm-cli.js" /usr/local/bin/npm \
    && ln -s "/usr/local/lib/node_modules/npm/bin/npx-cli.js" /usr/local/bin/npx \
    && ln -s /opt/yarn-v1.??.?/bin/yarn /usr/local/bin/yarn \
    && ln -s /opt/yarn-v1.??.?/bin/yarnpkg /usr/local/bin/yarnpkg

# Some other instructions

рдЕрдм, рдореБрдЭреЗ рдпрд╛рд░реНрди рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдХреИрд╕реЗ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рд┐рдП рдЕрдЧрд░ рдЗрд╕реЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ рдЪрд░ рдореЗрдВ рдиреЛрдб рдЫрд╡рд┐ ( YARN_VERSION ) рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ?

рдорд▓реНрдЯреА-рд╕реНрдЯреЗрдЬ рдмрд┐рд▓реНрдб рдХреЛ рд╣рдорд╛рд░реЗ CI рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдмрдбрд╝реЗ рд▓рд╛рднреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред "рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕" рдЬреИрд╕реА рд╕реБрд╡рд┐рдзрд╛ рдЗрд╕реЗ рджреВрд╕рд░реЗ рд╕реНрддрд░ рдХреЗ рд░рдЦрд░рдЦрд╛рд╡ рдФрд░ рдлреАрдЪрд░ рд╡рд╛рд░ рдореЗрдВ рднреА рдЖрдЧреЗ рдмрдврд╝рд╛рдПрдЧреАред

рдореИрдВ рд▓рдЧрднрдЧ 5 рдкрд░рддреЗрдВ env vars рдХреЗ рднрд╛рд░реА рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде рд░рдЦ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рд╣рд░ рдЕрдкрдбреЗрдЯ рдПрдХ рдмреБрд░рд╛ рд╕рдкрдирд╛ рд╣реИред рдЙрдЬреНрдЬреНрд╡рд▓ рдкрдХреНрд╖ (?), рдореИрдВ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдореИрдВ рдПрдХ рдирдпрд╛ рдЪрд░рдг рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рджреЛ рдмрд╛рд░ рд╕реЛрдЪрддрд╛ рд╣реВрдВред

рд╡рд░реНрддрдорд╛рди рдПрдЖрд░рдЬреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреБрдЫ рдЬрд┐рдЬреНрдЮрд╛рд╕реБ рд╡реНрдпрд╡рд╣рд╛рд░ рджреЗрддрд╛ рд╣реИ:

FROM python
ARG X=os    # or ENV, the same  
RUN echo import ${X:-sys}   # Proof that the syntax works with default SHELL
SHELL ["python", "-c"]
RUN import os
RUN import ${X}  # Fails
RUN import ${X:-sys}  # Fails too, but this is a documented syntax (for ENV)

рдпрд╛

FROM alpine
ARG X=ab.cd
RUN echo ${X%.*}  # it's ok but it looks like magic 
WORKDIR ${X%.*}  # Fails here 

рдпрд╣ рдЗрд╕ рддрдереНрдп рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ рдХрд┐ рдПрдЖрд░рдЬреА рдкреНрд░рддрд┐-рдЪрд░рдг рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рд╣реИрдВ, рди рдХрд┐ рдЯреЗрдВрдкрд▓реЗрдЯрд┐рдВрдЧред

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ (рдФрд░ рдореБрдЭреЗ) рд╢рд╛рдпрдж рдХрднреА рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ (рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реЗрд░рдлреЗрд░ рд╢рд╛рдпрдж ...)ред
рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдбреЙрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЕрдВрдбрд░рд▓реЗрдпрд░ рд╢реЗрд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЭреВрда рдмрдирд╛рддрд╛ рд╣реИ: (https://docs.docker.com/engine/reference/builder/#environment-replacement рдФрд░ рдХрд╛рдЙрдВрдЯрд░-рдЙрджрд╛рд╣рд░рдг " RUN import ${X:-sys} " рджреЗрдЦреЗрдВ)

RUN рд╡рд┐рд░рд╛рд╕рдд рдХреА рддрд░рд╣ 'рдХрдорд╛рдВрдб' рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ ARG рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ?

$ cat Makefile
SHELL=python
X=os
test:
    import os
    import ${X}
$ make test
import os
import os

24 рдШрдВрдЯреЗ рдЦрддреНрдо рд╣реЛ рдЧрдП рд╣реИрдВ =)

_Warning_ рдпрд╣ рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдБ рдХрд┐ рдпрд╣ рд╣реЛрдЧрд╛!

рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ env var рд▓рд┐рдЦреЗрдВ рдФрд░ рджреВрд╕рд░реЗ рдЪрд░рдг рдореЗрдВ рдЙрд╕ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ? рдЖрджрд┐? рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕рдВ:

FROM golang:1.14 as cm_base
ARG commit_id
RUN echo "$commit_id" > /tmp/env.json
FROM golang:1.14
COPY --from=cm_base "/tmp/env.json" "/tmp/env.json"
ENV cm_cc_commit_id="$(cat /tmp/env.json)"

рдмреВрдо, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ cm_cc_commit_id рд╢рд╛рдмреНрджрд┐рдХ $(cat /tmp/env.json) , рдмрд╛рдж рд╡рд╛рд▓реЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рд╢рд╛рдмреНрджрд┐рдХ рд░рд╣рддрд╛ рд╣реИред рддреЛ рдбрд╛рдпрдирд╛рдорд┐рдХ рдПрдирд╡реА рд╡рд░реНрд╕реЗрд╕ рд╕реЗрдЯ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд▓рдЧрддрд╛ рд╣реИ?

рд╣рд╛рд▓рд╛рдБрдХрд┐ рдХреНрдпрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реИ, рдЖрдкрдХреЗ рдПрдВрдЯреНрд░реАрдкреЙрдЗрдВрдЯ рдХреЛ рдмреИрд╢ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдпрд╣ рдХрд░ рд░рд╣рд╛ рд╣реИ:

#!/usr/bin/env bash
echo "the docker entrypoint args:" "$@"
export cm_cc_commit_id="$(cat /tmp/env.json)"
"$@"

рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕реЛрдЪреЗрдВ:

Dockerfile рдХреЗ рдкрд╛рд╕ рд╡реИрд╢реНрд╡рд┐рдХ ARG рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рд╛рдзрди рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдореЗрдВ рдирд╣реАрдВ рдлреИрд▓рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ рдХреИрд╢рд┐рдВрдЧ рдкрд░ рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рддрд╛ рд╣реИред
рдмрд┐рд▓реНрдбрд░ рд╣реЛрд╢рд┐рдпрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдЪрд░рдг рдореЗрдВ ARG рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рддрдм рдЖрдкрдХреЛ рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рд╢рд╛рдмреНрджрд┐рдХ рдЪрд╛рд╣рддреЗ рдереЗ рдпрд╛ рдирд╣реАрдВред

рддреЛ рд╣рд╛рдБ, рдЖрдкрдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡реИрд╢реНрд╡рд┐рдХ ARG s рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдореЗрдВ рдЖрдпрд╛рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕реЗ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдмрд┐рд▓реНрдбрд░ рдпрд╛ рдХреЛрдИ рд▓рд┐рдВрдЯрд░ рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЪреЗрддрд╛рд╡рдиреА рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХреЗ рдЬрд╣рд╛рдВ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк ARG рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реЛрдВрдЧреЗред
рдпрд╣ рдбрд┐рдЬрд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рддреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдХреЛрдб рдХреЗ рдХрдо рд▓рд╛рдЗрдиреЛрдВ рдкрд░ рдЗрд╖реНрдЯрддрдо рдХреИрд╢рд┐рдВрдЧ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╡рд┐рдХрд▓реНрдк рд╣реИред

рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡реИрд╢реНрд╡рд┐рдХ ARG s рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реВ рдореЗрдВ рднреНрд░рдорд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

nisanharamati picture nisanharamati  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

netoneko picture netoneko  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

cmingxu picture cmingxu  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dbanck picture dbanck  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

gg7 picture gg7  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ