在构建容器时,不应用环境变量。
docker-compose.yml:
img:
build: img
environment:
VAR: Hello
/ img / Dockerfile:
FROM python:2.7
RUN python -c 'import os; print os.environ["VAR"]'
预期写有“ Hello”,收到KeyError: VAR
-缺少环境变量。
如果您使用docker-compose run --rm img bash
进入容器(在删除最后一条失败的行之后)并执行python -c 'import os; print os.environ["VAR"]'
,则将获得预期的结果。
docker-compose==1.3.3
docker-version
:
Client version: 1.7.1
Client API version: 1.19
Go version (client): go1.4.2
Git commit (client): 786b29d
OS/Arch (client): linux/amd64
Server version: 1.7.1
Server API version: 1.19
Go version (server): go1.4.2
Git commit (server): 786b29d
OS/Arch (server): linux/amd64
这是预期的。 docker-compose.yml
的environment:
键与在docker run
命令中启动容器所指定的键相同。 build
和dockerfile
是用于生成图像的旧键。
从文档中可能看不出来,可以进行改进。
Docker不支持将环境注入到构建环境中(它必须是Dockerfile的一部分),但我相信有一些开放的建议来添加对类似内容的支持。
这让我们很难接受,确实需要更好的文档。
该文档确实令人困惑,例如,谈论env文件,该文件用于docker-compose.yml
,而用于docker run
。 鉴于docker-compose是用于构建和运行容器的编排工具,可以很容易地假设使用--env <key>=<value>
类的环境将环境应用于构建时间。
也咬我
仅需说明,可以在compose文件中将环境变量设置为build args。 像该线程上的其他线程一样,我最初希望env_file或环境可同时用于构建和运行。
已通过撰写文件v2,docker-compose v1.7和docker-engine v1.11验证。
请注意,如果您需要从文件中包含环境变量,则可以执行以下操作。 这将需要(在docker-compose build部分中)从这些变量设置的args,然后可以在docker文件中引用它们。 这意味着虽然您不能直接重用env_file,但可以做一些额外的工作。
env $(cat vars.env | xargs) docker-compose up --build <whatever>
这个堆栈溢出问题的答案有助于https://stackoverflow.com/questions/19537645/get-environment-variable-value-in-dockerfile
可以将.env环境变量映射到ARGS,以便在构建期间由Dockerfile使用。
docker-compose.yml
version: "2"
services:
lumen:
build:
context: .
dockerfile: ./Dockerfile
args:
- PORT=${PORT}
volumes:
...
Dockerfile
FROM php:7.0-apache
ARG PORT
ENV PORT "$PORT"
EXPOSE ${PORT}
...
@williamli您可以向“堆栈溢出”问题添加链接吗?
抱歉,我不确定我是否知道该如何解决-我想使用一个预先构建的图像。
版本:“ 3”
服务:
web1:
图片:softwaremaker / web-w
环境:
我以前认为api映像(softwaremaker / api-w)可以解析为我在上面设置的环境变量,但是它不起作用。
@PatrLind
在我的原始评论中添加了stackoverflow链接。
https://stackoverflow.com/questions/19537645/get-environment-variable-value-in-dockerfile
此问题与除默认.env
文件以外的env文件仍然有关。
Fe Next代码不起作用:
nginx:
env_file:
- .env
- .env.local
environment:
- SERVER_NAME=${SERVER_NAME}
build:
context: ./nginx
dockerfile: Dockerfile
args:
server_name: ${SERVER_NAME}
而SERVER_NAME是在第二个环境文件( .env.local
)中定义的。
我看不到从.env.local传递env var来构建上下文的选项((
@remort
我也可以确认这一点,如果在构建过程中使用了变量,则仅在文件名为.env
情况下才将其传递给构建过程,如果将它们命名为.env.docker
,则不会得到它们已接。 即使将env_file
指定为使用.env.docker
文件。
在构建期间,我的解决方案是将另一个命名的env文件复制并重命名为.env
COPY .env.docker ${APP_HOME}/.env
WORKDIR $APP_HOME
此后,它似乎在容器运行时提取环境变量
作业系统: macOS(10.14.6)
Docker桌面版本: 2.1.0.5(40693)
引擎版本: 19.03.5
撰写: 1.24.1
嗨,大家好,
一个简单的问题要问大家,这是否是为开发人员建立映像的更好方法? 到目前为止,它工作正常。 但是,这是推荐的做法吗? 所有图像均基于破坏者。
```
来自redis:破坏者为redis
运行mkdir / env && env> /env/.env_redis
运行cat / etc / passwd
运行ls -lah / home
来自红宝石:超薄克星AS红宝石
运行mkdir / env && env> /env/.env_ruby
FROM节点:lts-buster-slim AS节点
运行mkdir / env && env> /env/.env_node
FROM nginx:最新AS nginx
运行mkdir / env && env> /env/.env_nginx
来自php:fpm-buster AS php
运行mkdir / env && env> /env/.env_php
复制--from = redis //
复制--from =红宝石/ /
复制--from = node //
复制--from = nginx //
添加conf / include-site.conf /etc/nginx/conf.d/include-site.conf
添加conf / supervisord.conf /etc/supervisord.conf
su su root
展览80443
WORKDIR“ / var / www / html”
ENTRYPOINT [“ / bin / bash”,“ /start.sh”]
问题仍然存在。
与通过args将env vars传递到容器构建相比,build区段中的env_file关键字将更加清晰。
像这样:
#NOT_WORKING
build:
context: ./client
dockerfile: Dockerfile
env_file: ${CURRENT_ENV_FILE}
因为我正在使用Shell脚本来构建和构建docker compose。
对于生产,我需要与dev / local不同的env_file。
而且有许多带有许多args的docker-compose.env.yml文件,所以我认为这并不方便
我认为需要采取一些优雅的方法。 我真的很喜欢docker语法,使用参数代替环境变量对我来说没有意义。 我不希望有人手动更改我的docker-compose文件。 更改.env文件中的值似乎与我一致。
最有用的评论
这个堆栈溢出问题的答案有助于https://stackoverflow.com/questions/19537645/get-environment-variable-value-in-dockerfile
可以将.env环境变量映射到ARGS,以便在构建期间由Dockerfile使用。
docker-compose.yml
Dockerfile