>

CentOS 7을 기본 이미지로 사용하여 도커 컨테이너에서 python3 응용 프로그램을 실행하려고합니다. 인터랙티브 방식으로 연주하는 경우 scl enable rh-python36 bash 를 입력합니다.

내 표준 python2 환경을 내가 이전에 설치 한 python3.6 환경으로 분명히 바꾼다 (Dockerfile에서) 이제 dockerfile에서 이전에 다음을 실행한다 :

SHELL ["scl", "enable", "rh-python36"]  (그리고 이것의 많은 변형)

이 python3 환경에서 모든 pip 설치를 수행 할 수 있습니다. 그러나 실제로 CMD로 app.py를 실행하려는 경우 기본값은 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"]

또한 별칭 솔루션을 시도했지만 CMD의 python exe를 변경하지 않을까 걱정됩니다. 여전히 파이썬 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로 만든 새로운 셸에서이 중 어느 것도 지속되지 않는 것처럼 보입니다


  • 답변 # 1

    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"]
    
    

  • 답변 # 2

    C.Nivs의 답변과 여기에 대한 답변 덕분에 이것을 알아 냈습니다. 별명은 대화식 쉘에서 작동하지만 CMD에서는 작동하지 않습니다. 내가 한 일은 비슷했습니다. 제 경우에만 특수한 python36 exe를 호출하는 새로운 실행 파일을/usr/bin에 작성하고 있습니다.

    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 설치를 호출하는 스크립트를 실행합니다.

    이 답변을 질문의 맥락으로 남겨두고 있지만 문제를 해결하지않습니다. 내 시도는 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 -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
    
    

  • 이전 asp.net - 좌표를 기반으로 PDF에서 요소 강조 표시 C #
  • 다음 c# - moqmockexception - mock의 다음 설정이 일치하지 않습니다