在这个问题上花了太长时间,也看了大量关于docker的参考资料和很多很多堆栈溢出的文章,我不得不认输,向小组求助
我想实现的是让我的NODE_ENV定义在docker文件之外的某个地方,这样它就可以被.gitignored。
所以我希望能够在同一个顶层目录下有一个.env文件,以及docker-compose.yml和Dockerfile,其中包含一个NODE_ENV的条目。
听起来很直接?
首先我在dockerfile中的CMD语句出现了问题。研究了一下,我发现我需要做这样的事情。
FROM node:latest
ENV NODE_ENV=development
WORKDIR /usr/src/app
COPY ./package*.json /usr/src/app/
RUN npm install
ADD . .
CMD ["sh", "-c", "npm run start:${NODE_ENV}"]
EXPOSE 3001
它的工作原理就像一个魅力,然后我从命令行运行它,并使用
docker run -e "NODE_ENV=development" 。
然而,把docker-compose带入方程,一切都会出错。而且它也没有给出什么错误的方式。
version: '3'
services:
app:
build: .
environment:
- NODE_ENV=$NODE_ENV
ports:
- '80:3001'
links:
- mongodb
mongodb:
image: mongo
ports:
- '27017:27017'
现在,如果我使用docker-compose配置运行这个,我可以看到环境变量被正确设置了。
services:
app:
build:
context: /home/me/myproject
environment:
NODE_ENV: development
links:
- mongodb
ports:
- 80:3001/tcp
mongodb:
image: mongo
ports:
- 27017:27017/tcp
version: '3.0'
所以我的问题基本上是,谁能发现我做错了什么?还是说这是docker的一个bug,我应该报告?
从日志中给出的唯一线索就是
app_1 exited with code 2
并在容器日志中
/bin/sh: 1: [: npm run ,: unexpected operator
我通过把docker-compose中的环境变量行用双引号来实现。
version: '3'
services:
app:
build: .
environment:
- "NODE_ENV=$NODE_ENV"
ports:
- '80:3001'
links:
- mongodb
mongodb:
image: mongo
ports:
- '27017:27017'