[英]sharing values among files Dockerfile, docker-compose.yml, python.py, and shell
例如,我想將值PORT
設置一次。 如果PORT
設置在一個文件中並且其他文件將引用該值,那就太好了。
但是,在我的foo項目中,值PORT
必須在幾個文件中設置,每個文件都由不同的技術解析:
文件foo.py
#!/usr/bin/env python
PORT = 80
文件Dockerfile
# foo
ENV PORT=80
EXPOSE ${PORT}
文件docker-compose.yml
version: '2'
services:
web:
image: docker.corp.com/foo
expose:
- '80'
文件run.sh
#!/usr/bin/env sh
PORT=80
git commit
文件,例如沒有“即時”代碼生成器。
似乎最簡單的解決方案是在本地環境中設置PORT
。
然后:
您的 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
# Don't bother setting ENV PORT
EXPOSE 80
# docker-compose.yml
services:
web:
image: docker.corp.com/foo
# expose: is already in the Dockerfile, but you probably need
ports:
- '8000:80'
# ^^ where this matches the image
您也不需要在每個級別設置值。 如果您在EXPOSE
中公開一個端口,則您不需要也expose:
Dockerfile
docker-compose.yml
的相同端口; 如果您在Dockerfile
中設置ENV
,則無需在容器內運行的 shell 腳本中設置它。
在您的腳本本身中,您可能會在 Docker 內部和 Docker 外部運行它以進行日常開發,因此在此處進行諸如端口號、數據庫連接等詳細信息是很有用的。
# foo.py
PORT = int(os.environ.get('PORT', '80'))
我在日常工作中對此采取的一般方法是使腳本中的默認值與開發人員的需求相匹配——“高”端口,如 8000,數據庫在localhost
上運行——但在 Docker 部署中為不同的環境重新配置它.
對於與 Docker 設置(如端口號)無關的事情,對於您提出的具體問題,有一個更一般的答案。 假設您有其他一些環境變量
# The URL the service is ultimately reachable at, taking
# things like load balancers into account
EXTERNAL_URL = os.environ.get('EXTERNAL_URL', '')
#!/bin/sh
echo "Your service will be reachable at $EXTERNAL_URL"
exec ./myscript.py
這些變量在腳本最終運行之前不會被解析,所以如果你在docker-compose.yml
中設置一次,其他人都可以閱讀它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.