docker-compose
构建镜像时传递环境变量,并使docker run image command
识别它们?
我有这个Dockerfile:
FROM mhart/alpine-node:10
ADD . /app
WORKDIR /app
RUN apk --no-cache add --virtual builds-deps build-base python &&\
yarn global add nodemon &&\
yarn &&\
apk del builds-deps build-base python
还有这个docker-compose.yml文件:
version: "3.3"
services:
api:
build:
context: .
dockerfile: Dockerfile-preprod
image: registry.git.louis-girones.fr:4567/make-your-night/back:preprod
environment:
- NODE_ENV=development
env_file:
- .env
volumes:
- .:/app
ports:
- "${PORT_PREPROD}:${PORT_PREPROD}"
command: sh -c "mkdir -p dist && touch ./dist/app.js && yarn run start"
mongo:
image: mongo:4.0
ports:
- "${MONGO_PREPROD}"
command: mongod
volumes:
- ./data:/data/db
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:6.1.1
volumes:
- ./esdata:/usr/share/elasticsearch/data
environment:
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- discovery.type=single-node
ports:
- "9300:9300"
- "9200:9200"
volumes:
esdata:
通过这个.env文件(在根目录中,就像docker-compose.yml和Dockerfile一样):
#!/usr/bin/env bash
NODE_ENV=development
PORT=9000
SECRET_SESSION=superSecr3t
APP_NAME=Night Vision
API_VERSION=/api/v0/
DEFAULT_TZ=Europe/Paris
ASSETS_URI=http://localhost:9000/public/img/
BCRYPT_WORKFACTOR=1
ES_PORT=9200
ES_LOG_LEVEL=trace
而这段代码是在Node服务器启动时执行的:
// Export the config object based on the NODE_ENV
// ==============================================
const config: IConfig = commonConfig
if (commonConfig.env === 'development') {
_.merge(config, developmentConfig)
} else if (commonConfig.env === 'test') {
_.merge(config, testConfig)
} else if (commonConfig.env === 'preproduction') {
_.merge(config, preproductionConfig)
} else if (commonConfig.env === 'production') {
_.merge(config, productionConfig)
} else {
throw new Error('Please set an environment')
}
当我运行docker-compose build
命令时,一切都很好,但是例如,如果我尝试docker run myimage yarn run test
,会抛出错误“请设置环境变量”。我期望
env_file:
- .env
这使得此文件的环境变量可以在我的镜像中访问,但实际情况并非如此,这就是为什么我尝试添加的原因。 environment:
- NODE_ENV=development
但仍然没有成功,我也尝试在构建时将我的环境变量作为命令行参数传递:
docker-compose build --build-arg NODE_ENV=development api
但是它给了我这个消息:
[Warning] One or more build-args [NODE_ENV] were not consumed
Successfully built 9b14dd5abc3f
我更喜欢使用第一种或第二种方法。
docker版本:18.06.1-ce docker-compose版本:1.19.0
echo $NODE_ENV
,查看结果。它是development
吗? - Kevin KopfENV NODE_ENV=development
,这个方法确实有效,但是我没有时间接受它,而且我更喜欢像ENV NODE_ENV=${NODE_ENV}
这样的方法,但似乎不起作用。 - L. Faros#!/usr/bin/env bash
,echo $NODE_ENV 仍显示一行空白,虽然感谢您的帮助。 - L. Faros