簡體   English   中英

在文件 Dockerfile、docker-compose.yml、python.py 和 Z2591C98B70119FE6248Z198B1E4 之間共享值

[英]sharing values among files Dockerfile, docker-compose.yml, python.py, and shell

How do I share a value among the stack of technologies docker , docker-compose , Python , and POSIX shell for a single project?

例如,我想將值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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM