Как использовать scl enable для запуска приложения python3 в dockerfile - PullRequest
0 голосов
/ 04 июня 2019

Я пытаюсь запустить приложение python3 в док-контейнере, используя CentOS 7 в качестве базового образа. Поэтому, если я просто играю с ним в интерактивном режиме, я набираю scl enable rh-python36 bash

Это, очевидно, переключает мою стандартную среду python2 на среду python3.6, которую я установил ранее (в Dockerfile) Теперь, ранее в файле dockerfile, я запускаю следующее:

SHELL ["scl", "enable", "rh-python36"] (и многие варианты этого)

Это позволяет мне выполнять все мои установки pip в этой среде python3. Однако, когда я на самом деле хочу запустить мой app.py с CMD, по умолчанию используется python2. Я пытался поиграть с ENTRYPOINT и вариациями CMD, но, похоже, я не могу сделать среду Python3 активной, когда контейнер наконец-то запустится. Как я могу заставить это работать правильно с python3?

Вот докер-файл:

FROM centos:7
RUN mkdir -p /usr/src/app && \
  yum install -y centos-release-scl && \
  yum install -y rh-python36 && \
  yum install -y rh-python36-python-tkinter
SHELL ["scl", "enable", "rh-python36"]
WORKDIR /usr/src/app
COPY . .
WORKDIR /usr/src/app/codeBase
RUN pip install --no-cache-dir -r /usr/src/app/codeBase/requirements.txt
EXPOSE 9000
CMD ["python",  "run.py"]

Я также пробовал решение с псевдонимом, но боюсь, что оно не меняет exe для Python для CMD: вот полностью работоспособная версия с той, которая все еще печатает python 2.7.5:

FROM centos:7
RUN mkdir -p /usr/src/app && \  
  yum install -y centos-release-scl && \
  yum install -y rh-python36 && \
  yum install -y rh-python36-python-tkinter
WORKDIR /usr/src/app
RUN alias python=$(find / -type f -name "python*" | grep "python3.6$")
CMD ["python",  "-V"]

Похоже, что ничего не происходит в новой оболочке, созданной с помощью CMD

Ответы [ 3 ]

2 голосов
/ 04 июня 2019

SHELL - совершенно неправильная команда Dockerfile для этого. Возможно, вы захотите поместить это в RUN строфу.

Цель SHELL - определить оболочку, используемую для выполнения RUN команд. Так что-то вроде

SHELL ["sh", "-c"] # The default
RUN echo "foo"

заканчивает тем, что бежит

sh -c 'echo "foo"'

Конечно, замена SHELL командой, которая не поддерживает этот вариант использования, просто сломает команду RUN.

Может быть, попробовать что-то вроде

FROM centos:7
RUN mkdir -p /usr/src/app && \
  yum install -y centos-release-scl && \
  yum install -y rh-python36 && \
  yum install -y rh-python36-python-tkinter
WORKDIR /usr/src/app
COPY . .
WORKDIR /usr/src/app/codeBase
RUN scl enable rh-python36 pip install --no-cache-dir -r ./requirements.txt
EXPOSE 9000
CMD ["scl", "enable", "rh-python36", "python",  "run.py"]
1 голос
/ 04 июня 2019

Так что я понял это благодаря ответу C.Nivs и ответу здесь .Псевдоним работает в интерактивной оболочке, но не для CMD.То, что я в итоге сделал, было похоже, только в моем случае я создаю новый исполняемый файл в / usr / bin, который вызывает специальный python36 exe:

RUN echo -e '#!/bin/bash\n$(find / -type f -name "python*" | grep "python3.6$") "$@"' > /usr/bin/py3 && \
    chmod +x /usr/bin/py3
CMD ["py3",  "-V"]

, теперь py3 запускает скрипт, вызывающий установку python3 специальнос любым аргументом

1 голос
/ 04 июня 2019

Примечание:

Я оставляю этот ответ в качестве контекста вопроса, но это не решает проблему. Я пытался изменить, куда указывает python, но при выполнении команды RUN оболочка завершится, и вы потеряете alias. Модификация PYTHONPATH с помощью bash также не требуется, для этого вопроса . Спасибо @tripleee за улов

К сожалению, похоже, что yum install -y rh-python36 ставит этот python3.6 в действительно странное место:

find / -type f -name "python*" | grep "python3.6$"
/opt/rh/rh-python36/root/usr/bin/python3.6

Вы можете использовать это для alias вашей python команды в вашем Dockerfile:

RUN mkdir -p /usr/src/app && \
  yum install -y centos-release-scl && \
  yum install -y rh-python36 && \
  yum install -y rh-python36-python-tkinter

# Here
RUN alias python=$(find / -type f -name "python*" | grep "python3.6$")

Что должно позволить вам сохранить ваш CMD, а также привязать его к правильному site-packages:

import sys

sys.path
['', '/opt/rh/rh-python36/root/usr/lib64/python36.zip', '/opt/rh/rh-python36/root/usr/lib64/python3.6', '/opt/rh/rh-python36/root/usr/lib64/python3.6/lib-dynload', '/opt/rh/rh-python36/root/usr/lib64/python3.6/site-packages', '/opt/rh/rh-python36/root/usr/lib/python3.6/site-packages']

Похоже, это также может устранить необходимость scl enable в этой среде Python, так как вы можете просто использовать python -m pip...:

# No scl has been run
python -m pip install requests
# running python in the terminal
import requests

r = requests.get('http://google.com')
# runs like a charm
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...