tannerman
tannerman

Reputation: 578

docker arg misssing in multi-stage builds

ARG BUILD_DIR missng after second FROM. What I doing wrong?

Dockerfile:


# build
# одноразовый контейнер
FROM node:latest as build

ARG BUILD_DIR=/build
# создание директории приложения
WORKDIR $BUILD_DIR

# установка зависимостей
# символ астериск ("*") используется для того чтобы по возможности
# скопировать оба файла: package.json и package-lock.json
COPY package*.json \
    tsconfig.json \
    ./

COPY src src

RUN echo ${BUILD_DIR}

RUN npm i
RUN npm run build

# ---------------------------------------
# build end
#
# app
# ---------------------------------------
RUN echo "1\n"; test -n "$BUILD_DIR" || (echo "BUILD_DIR  not set" && false)
FROM node:14-alpine as production
RUN echo "2\n"; test -n "$BUILD_DIR" || (echo "BUILD_DIR  not set" && false)
ARG PM2_CONFIG=out/config/ecosystem.config.js

#RUN apt-get update && apt-get install -y \
#    build-essential

RUN npm i -g pm2

# создание директории приложения
WORKDIR /usr/local/app

RUN echo ${BUILD_DIR}

COPY --from=build /build/out out
COPY --from=build /build/node_modules node_modules

#EXPOSE # бот использует поллинг

CMD pm2 start ${PM2_CONFIG} && pm2 logs

Part of output is

Step 9/18 : RUN echo "1\n"; test -n "$BUILD_DIR" || (echo "BUILD_DIR  not set" && false)
 ---> Running in c7b0a92fc970
1

Removing intermediate container c7b0a92fc970
 ---> 977a5ec0be6f
Step 10/18 : FROM node:14-alpine as production
 ---> 87c43f8d8077
Step 11/18 : RUN echo "2\n"; test -n "$BUILD_DIR" || (echo "BUILD_DIR  not set" && false)
 ---> Running in e2b3de94bb3a
2\n
BUILD_DIR  not set
The command '/bin/sh -c echo "2\n"; test -n "$BUILD_DIR" || (echo "BUILD_DIR  not set" && false)' returned a non-zero code: 1

docker version: 19.03.8

Upvotes: 3

Views: 2325

Answers (1)

tannerman
tannerman

Reputation: 578

ARG BUILD_DIR=/build

# build
# одноразовый контейнер
FROM node:14 as build

ARG BUILD_DIR

There is global and local scope Global can be translated into local of each container

Expansion: ARGs defined before the first FROM statement are available in every subsequent FROM statement, and can be transferred "into" each build stage by also adding an ARG statement with the same name and no default content. Note that defining the ARG prior to the first FROM statement is the ONLY way to make them available to subsequent FROM statements.

Upvotes: 2

Related Questions