在Dockerfile、docker-compose.yml、python.py和shell文件之间共享值 如何在单个项目的docker、docker compose、Python和POSIX shell技术堆栈中共享价值?
例如,我想设置一次端口值。若在一个文件中设置端口,而其他文件将引用该值,那个就太好了 但是,在my foo项目中,必须在多个文件之间设置值端口,每个文件都是由不同技术解析的: 文件foo.py 文件归档文件 文件docker-compose.yml 文件run.sh在Dockerfile、docker-compose.yml、python.py和shell文件之间共享值 如何在单个项目的docker、docker compose、Python和POSIX shell技术堆栈中共享价值?,python,shell,docker,docker-compose,Python,Shell,Docker,Docker Compose,例如,我想设置一次端口值。若在一个文件中设置端口,而其他文件将引用该值,那个就太好了 但是,在my foo项目中,必须在多个文件之间设置值端口,每个文件都是由不同技术解析的: 文件foo.py 文件归档文件 文件docker-compose.yml 文件run.sh 最好是git按原样提交文件,例如不使用动态代码生成器。似乎最简单的解决方案是在本地环境中设置端口 然后: python代码可以从os.environ读取值 您可以通过以下方式在docker compose中为您的容器提供值: env
最好是git按原样提交文件,例如不使用动态代码生成器。似乎最简单的解决方案是在本地环境中设置端口 然后: python代码可以从os.environ读取值 您可以通过以下方式在docker compose中为您的容器提供值:
environment:
PORT: ${PORT}
如果需要在docker compose之外启动容器,可以在docker run命令行上传递它:
docker run -e PORT=$PORT ...
当然,run.sh脚本可以直接引用$PORT
有一些东西,比如文件系统路径和TCP端口号,Docker允许在容器运行时选择一个值,并且该值不必与映像中的值相同。对于您给出的TCP端口示例,只选择一些数字而不尝试在Docker层对其进行配置通常更容易 Dockerfile 不要费心设置环境端口 暴露80 docker-compose.yml 服务: 网状物: 图片:docker.corp.com/foo 暴露:已在Dockerfile中,但您可能需要 端口: - '8000:80' ^^这与图像匹配的位置 您也不需要在每个级别设置值。如果在docker文件中公开一个端口,则无需同时公开:docker-compose.yml中的同一端口;如果在Dockerfile中设置ENV,则无需在容器内运行的shell脚本中设置 在脚本本身中,您可能会在Docker内部和Docker外部运行它,以进行日常开发,因此创建端口号、数据库连接等详细信息非常有用。。。在那里 福比 PORT=intos.environ.get'PORT',80' 我在日常工作中对此采取的一般方法是使脚本中的默认值与开发人员需要的值相匹配——高端口,如8000,数据库在本地主机上运行——但在Docker部署中,为不同的环境重新配置它 对于端口号等与Docker设置无关的内容,您所问的特定问题有一个更一般的答案。假设您有其他环境变量 服务最终可访问的URL,以 负载平衡器之类的东西也要考虑在内 EXTERNAL\u URL=os.environ.get'EXTERNAL\u URL', !/垃圾箱/垃圾箱 echo您的服务将可通过$EXTERNAL\u URL访问 exec./myscript.py
这些变量在脚本最终运行之前不会解析,因此如果在docker-compose.yml中设置一次,其他所有人都可以读取它。您可以控制环境吗?这些文件中的任何一个都可以动态生成吗?这是非常广泛的…你能控制环境吗?在某种程度上,有一个简单的项目驻留在我的本地工作站上。但我也希望Rancher Docker服务公司负责这个项目。这些文件中的任何一个都可以动态生成吗?假设没有一个是动态构建的。以下哪一个是正在运行的rancher服务?以下哪一个是正在运行的rancher服务?Rancher使用docker-compose.yml运行docker文件构建的docker映像。我也在考虑这个问题。这是个不错的方法。不幸的是,我不能以一种干净的方式提交它。在我的例子中,Rancher Docker服务可以访问git提交的文件,但是我不能以一种有意义的方式控制Rancher实例环境?是的。我更新了我以前的评论。
version: '2'
services:
web:
image: docker.corp.com/foo
expose:
- '80'
#!/usr/bin/env sh
PORT=80
environment:
PORT: ${PORT}
docker run -e PORT=$PORT ...