创建React App Build和Docker-Compose不传递环境变量

时间:2018-12-11 10:05:00

标签: reactjs docker docker-compose create-react-app

我目前正在尝试进行CRA应用程序的多步骤构建。我的dockerfile如下所示

FROM node:10-alpine

WORKDIR /usr/app

COPY package*.json ./

RUN npm install

COPY . .

RUN npm run build

FROM nginx:1.15

COPY --from=0 /usr/app/nginx/default.conf /etc/nginx/conf.d/default.conf
COPY --from=0 /usr/app/build /usr/share/nginx/html

EXPOSE 6000

我的react部分的docker撰写文件如下

  web_front:
    build:
      context: Web Front-CRA
    ports:
      - "${WEB_FRONT_PORT}:6000"
    env_file:
      - .env
    volumes:
      - /usr/app/node_modules
      - ./Web Front-CRA:/usr/app

当我尝试使用docker-compose up --build运行此程序时,我无法读取NODE_PATH=./src/环境文件(所有环境变量实际上都在RUN npm run build阶段。

但是,如果我只是像下面那样更改dockerfile来运行dev环境,它就可以完美地工作-所有的env文件都已通过

FROM node:10-alpine

# work directory
WORKDIR /usr/app

# Copy dependencies first for effective caching
COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 6000

CMD ["npm", "run", "start"]

我目前正在使用ubuntu 18和docker-compose v1.23.2和Docker 18.09.0。我在做什么错了?

2 个答案:

答案 0 :(得分:1)

.env文件是docker-compose的一个特殊的名称保留文件,用于设置环境变量的默认值,因此,如果要使用它,则不应该在撰写文件中指定,或使用myservice.env部分中使用不同的文件名(例如:env_file)。

  web_front:
    env_file:
      - webfront.env
...

码头工人文档在https://docs.docker.com/compose/env-file/下的撰写文件和CLI变量 / 注释部分

含糊地提及了这一点。
  

.env文件中定义的环境变量在容器内部不会自动显示。

要设置容器适用的环境变量,请遵循主题“ Compose中的环境变量”中的准则,该指南描述了如何将Shell环境变量传递给容器,如何在Compose文件中定义环境变量,以及更多内容:

答案 1 :(得分:0)

要从docker compose构建阶段将环境变量传递到dockerfile,必须在docker-compose构建步骤中使用 args:。下面的例子

web_front:
    build:
      context: Web Front-CRA
      args:
         NODE_PATH=./src/
    ports:
      - "${WEB_FRONT_PORT}:6000"
    env_file:
      - .env
    volumes:
      - /usr/app/node_modules
      - ./Web Front-CRA:/usr/app

对应的dockerfile

FROM node:10-alpine
ARG NODE_PATH
WORKDIR /usr/app

COPY package*.json ./

RUN npm install

COPY . .

RUN npm run build

FROM nginx:1.15

COPY --from=0 /usr/app/nginx/default.conf /etc/nginx/conf.d/default.conf
COPY --from=0 /usr/app/build /usr/share/nginx/html

EXPOSE 6000

使用$NODE_PATH在dockerfile中访问它。 PS我在这里使用环境变量,而不是envfile。但我希望你明白这一点。干杯。