我想做什么
我尝试在docker上使用命令构建我的项目:docker compose --env-file ./production.env up --build
。我想在Dockerfile之外的单独文件中定义环境变量。我使用了——env-file标志(https://docs.docker.com/compose/environment-variables/set-environment-variables/#substitute-with---env-file)。
执行完命令后,Docker没有报错,成功创建了容器。但是,我的项目检测到环境变量缺失并退出。
<标题>我的设置我正在运行一个节点项目。文件结构是
- docker-compose.yml
- Dockerfile
- production.env
- …其他文件(src文件夹等) 我Dockerfile
FROM node:16-alpine as development
WORKDIR /usr/src/app
COPY package*.json .
RUN npm install
COPY . .
RUN npm run build
FROM node:16-alpine as production
WORKDIR /usr/src/app
COPY package*.json .
RUN npm ci --only=production
COPY --from=development /usr/src/app/dist ./dist
CMD ["node", "dist/index.js"]
我docker-compose.yml:
version: "3.4"
services:
api:
build:
context: .
target: production
ports:
- 8888:8888
我的节点项目需要运行环境变量,如果没有检测到所有环境变量,将抛出和异常。这些羡慕对象存储在生产环境中。Env文件和一个示例说明我是如何制作的。Env文件看起来:
DB_URI=https://urihere.net
PASSWORD_KEY=somepw
标题>
您实际上并没有将环境变量传递给容器。
一个选项是使用Composeenv_file:
将整个环境变量文件传递给容器;在这种情况下,您不需要docker-compose --env-file
选项。
services:
api:
env_file:
- production.env
docker-compose up --build -d # no --env-file
第二种方法是保留--env-file
选项,但使用environment:
选项将每个值传递给容器。
services:
api:
environment:
- DB_URI # without an `=value` part
- PASSWORD_KEY
docker-compose --env-file production.env up -d --build
Compose有两层环境变量。一般的Unix环境、.env
文件和任何--env-file
文件用于创建一组变量,这些变量可用于docker-compose.yml
文件中的变量替换。然而,这些不会自动传递到单个容器的环境;只使用environment:
和env_file:
内容(扩展和覆盖图像的ENV
行)。