【发布时间】:2018-12-18 19:38:50
【问题描述】:
我在 Dockerfile 和 docker compose 引用之后尝试将环境变量传递给 Docker 映像的所有方法都不起作用。
我想在使用 docker-compose 时在 docker build 期间使这个 env var 可用。
在我拥有的 Docker 主机上:
export BUILD_VERSION=1.0
app.js
console.log('BUILD_VERSION: ' + process.env.BUILD_VERSION);
Dockerfile:
FROM node
ADD app.js /
ARG BUILD_VERSION
ENV BUILD_VERSION=$BUILD_VERSION
RUN echo Build Time: $BUILD_VERSION
RUN node /app.js
CMD echo Run Time: $BUILD_VERSION
docker-compose.yml:
version: '3'
services:
app:
build:
context: .
args:
- BUILD_VERSION
如果我直接构建图像,则 env var 可以正常传递:
docker build -t test --no-cache --build-arg BUILD_VERSION .
并且在运行时也可用:
$ docker run --rm test
Run Time: 1.0
$ docker run --rm test node /app
BUILD_VERSION: 1.0
但不适用于 docker compose。
docker-compose up --build
...
Step 5/7 : RUN echo Build Time: $BUILD_VERSION
---> Running in 6115161f33bf
Build Time:
---> c691c619018a
Removing intermediate container 6115161f33bf
Step 6/7 : RUN node /app.js
---> Running in f51831cc5e1e
BUILD_VERSION:
它只在运行时可用:
$ docker run --rm test
Run Time: 1.0
$ docker run --rm test node /app
BUILD_VERSION: 1.0
我还尝试在 docker-compose.yml 中使用environment,如下所示,这再次使其在运行时可用,但在构建时不可用:
version: '3'
services:
app:
build:
context: .
environment:
- BUILD_VERSION
请指教,我怎样才能让它以最不复杂的方式工作?
【问题讨论】:
-
只要 Dockerfile 有 ENV AA=$BB 并且之前你已经完成了 export BB=CC ,那么 yaml 就不需要提及 args 或任何命令行 build-arg
-
@ScottStensland 也试过了;没用。 :(
-
我不使用 docker-compose 来构建图像,只是为了启动或关闭它的容器......构建我发出...... docker build --tag foo --no-cache 。 ... 其次是 ... docker push foo ... 对我来说 docker-compose yaml 文件的内容是运行时设置,它混合并过于复杂,使其还控制构建,特别是当您有许多具有不同重建标准的容器时与发射
-
我同意最好将所有构建任务保留在 Dockerfile 中,只要它在通过 docker-compose 调用时有效。但我还没有找到可行的解决方案。
标签: docker docker-compose environment-variables versioning