這只是一個理論問題。有沒有辦法運行 docker 但只運行一個特定的腳本而不更改 Dockerfile?也許用docker run [container]命令?
Dockerfile:
FROM python:3.8
ADD main1.py
ADD main2.py
ADD main3.py
ADD main4.py
ADD main5.py
理論命令:
docker run docker-test main2.py
uj5u.com熱心網友回復:
這沒有什么“理論上的”。Docker 將檔案復制到位,如果它們是可運行的可執行檔案,您可以使用docker run image executable... 但是
它要求檔案可以正確執行(或者您需要明確說
docker run image python executable要運行不可執行的 Python 腳本)它要求檔案在您的目錄中,
PATH以便您能夠在沒有路徑的情況下指定它們的名稱;或者您需要指定容器內的完整路徑,或者可能是相對路徑(./executable如果它們在容器的默認作業目錄中)docker run image /path/to/executable顯然,您需要將容器包含
python在PATH其中才能找到python;或者您同樣需要指定解釋器的完整路徑docker run image /usr/bin/python3 /path/to/executable
總之,可能要確保您有chmod x腳本檔案,并且它們的第一行包含(道德上的等價物)#!/usr/bin/env python3(或者python如果這就是二進制檔案的名稱)。
(很明顯,不要在您希望能夠在 Linux 容器中執行的檔案中使用 DOS 換行符。Python 可以應付,但 Linux 內核會尋找/usr/bin/env python3^M這是否正是它在shebang 行中所說的。)
uj5u.com熱心網友回復:
在 Python 應用程式的特定情況下,標準 Python setuptools包具有一些可以簡化此程序的功能。
在您的應用程式setup.cfg檔案中,您可以宣告入口點(不同于名稱相似的 Docker 概念),這些入口點提供簡單的腳本來啟動應用程式的特定部分。
[options.entry_points]
console_scripts =
main1 = app.main1:main
main2 = app.main2:main
腳本app/main1.py看起來像普通的頂級 Python 腳本
#!/usr/bin/env python3
# the console_scripts call this directly
def main():
...
# for interactive use
if __name__ == '__main__':
main()
現在在您的 Dockerfile 中,您可以使用通用的 Python 應用程式配方并安裝它;所有這些console_scripts都將在標準中自動可見$PATH。
FROM python:3.8
WORKDIR /app
COPY . .
RUN pip install .
CMD ["main1"]
docker run --rm my-image main2
值得注意的是,直到最后一部分,我們一直在使用通用的 Python 實用程式,您可以在沒有 Docker 的情況下做同樣的事情
# directly on the host, without Docker
python3 -m venv ./virtual_environment
. ./virtual_environment/bin/activate
pip install .
# then run any of the scripts directly
main3
# technically activating the virtual environment is optional
deactivate
./virtual_environment/bin/main4
這里的基本點是,相同的規則適用于在主機上、在 DockerfileCMD中或在docker run命令覆寫中運行命令(必須在 上$PATH、可執行、具有正確的解釋器等)。有關更通用的非 Python 特定方法,請參閱@tripleee 的答案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/378410.html
