我目前正在尝试进行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。我在做什么错了?
答案 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。但我希望你明白这一点。干杯。