Чистый ответ: Контейнеры Docker уже предоставляют отдельное изолированное пространство файловой системы со своим собственным пространством для установки библиотек Python, отдельно от системного Python и других контейнеров;вам не нужно устанавливать виртуальную среду внутри образа Docker.Если вы просто пропустите все, что связано с виртуальными средами, и убедитесь, что ваш сценарий является исполняемым, вы можете запустить его непосредственно как ENTRYPOINT, и он увидит «команду» как sys.argv
.
FROM python:3
WORKDIR /app
COPY requirements.txt ./
RUN pip install -r requirements.txt # as "system" packages
COPY . ./
RUN chmod +x my_script.py
ENTRYPOINT ["/app/my_script.py"]
Вам нужночтобы убедиться, что первая строка вашего скрипта Python содержит строку «shebang», чтобы система знала, что это Python:
#!/usr/bin/env python3
import ...
def main(): ...
if __name__ == '__main__':
main()
полный ответ на Python: Если вы пишете setup.py
script, он может генерировать сценарии оболочки , которые будут запускать какой-то конкретный модуль Python.Даже если вы установите его в виртуальной среде, вы можете запустить скрипт напрямую, без активации виртуальной среды, и он будет работать.
Так что ваш setup.py
может сказать:
from setuptools import setup
setup(
...
entry_points={
'console_scripts': [
'my_script = my_module.my_script:main'
]
}
)
Тогда ваш Dockerfile может сказать
FROM python:3
WORKDIR /app
COPY . ./
RUN python -m venv env
RUN ./env/bin/pip install .
ENTRYPOINT ["/app/env/bin/my_script"]
Минимальный ответ: Вы можете переместить расширенную настройку при вызове sh -c '...'
в сценарий оболочки.(Вы намекаете на это в своем вопросе.) Пока скрипт является исполняемым и содержит соответствующую строку #!/path/to/interpreter
в самом начале, вы можете просто запустить его напрямую, и он будет правильно понимать аргументы командной строки.Таким образом, этот скрипт может быть всего лишь
#!/bin/sh
# activate the virtual environment
# "." is POSIX standard and equivalent to bash-specific "source"
. env/bin/activate
# run the actual script, passing our command-line arguments on to it
exec python my_script.py "$@"
Тогда ваш Dockerfile выглядит как
...
COPY entrypoint.sh ./
RUN chmod +x entrypoint.sh
ENTRYPOINT ["/app/entrypoint.sh"]