Docker как сделать python 3.8 по умолчанию

#python #docker #pip #dockerfile #python-3.8

#python #docker #pip #dockerfile #python-3.8

Вопрос:

Я пытаюсь обновить существующий файл Dockerfile для переключения с python3.5 на python3.8 , ранее он создавал символическую ссылку для python3.5 и pip3 вот так:

 RUN ln -s /usr/bin/pip3 /usr/bin/pip
RUN ln -s /usr/bin/python3 /usr/bin/python
  

Я обновил файл Dockerfile для установки python3.8 из deadsnakes:ppa

 apt-get install python3-pip python3.8-dev python3.8-distutils python3.8-venv
  

если я удалю python3-pip , он жалуется на gcc

Компилятор C или заголовки Python не установлены в этой системе. Попробуйте запустить: sudo apt-get install gcc python3-dev

с этими установками на месте я пытаюсь обновить существующее создание символической ссылки примерно так:

 RUN ln -s /usr/bin/pip3 /usr/local/lib/python3.8/dist-packages/pip
RUN ln -s /usr/bin/pip /usr/local/lib/python3.8/dist-packages/pip
RUN ln -s /usr/bin/python3.8 /usr/bin/python3
  

он терпит неудачу, говоря

ln: не удалось создать символическую ссылку ‘/usr/bin/python3’: файл существует

который, я полагаю, терпит неудачу, потому что python3 указывает на python3.6 . если я попытаюсь: RUN ln -s /usr/bin/python3.8 /usr/bin/python он не жалуется на символическую ссылку, и изображение будет успешно построено, но при установке требований позже произойдет сбой (мы используем цели Makefile для установки зависимостей внутри контейнера с помощью pip и pip-sync ):

ОШИБКА: не удается удалить ‘python-apt’. Это проект, установленный distutils, и поэтому мы не можем точно определить, какие файлы принадлежат ему, что приведет лишь к частичному удалению.

я предполагаю, что python-apt он устанавливается как часть python3.6 установки по умолчанию, и python3.8 pip не может его удалить.

PS: мой образ Dockerfile основан на Ubunut 18.04, который поставляется python3.6 по умолчанию.

Как я могу правильно переключить Dockerfile / image с python3.5 на python3.8 ? поэтому я могу позже использовать pip напрямую, и это указывает на python3.8 pip

Ответ №1:

Замена системного python таким образом обычно не является хорошей идеей (поскольку это может привести к поломке программ уровня операционной системы, которые зависят от этих исполняемых файлов) — я немного расскажу об этом в этом видео, которое я сделал «почему не глобальный pip / virtualenv?»

Лучший способ — создать префикс и поместить его в PATH более ранний (это позволяет системным исполняемым файлам продолжать работать, но python использовать / python3 / и т. Д. будет использовать ваш другой исполняемый файл)

в случае deadsnakes, который, похоже, вы используете, должно сработать что-то вроде этого:

 FROM ubuntu:bionic

RUN : 
    amp;amp; apt-get update 
    amp;amp; DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends 
        software-properties-common 
    amp;amp; add-apt-repository -y ppa:deadsnakes 
    amp;amp; DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends 
        python3.8-venv 
    amp;amp; apt-get clean 
    amp;amp; rm -rf /var/lib/apt/lists/* 
    amp;amp; :

RUN python3.8 -m venv /venv
ENV PATH=/venv/bin:$PATH
  

ENV строка здесь является ключевой, которая помещает virtualenv в начало пути

 $ docker build -t test . 
...
$ docker run --rm -ti test bash -c 'which python amp;amp; python --version amp;amp; which pip amp;amp; pip --version'
/venv/bin/python
Python 3.8.5
/venv/bin/pip
pip 20.1.1 from /venv/lib/python3.8/site-packages/pip (python 3.8)
  

Отказ от ответственности: Я сопровождающий deadsnakes

Комментарии:

1. спасибо @Anthony за вклад, изначально я искал решение, которое не включало virtualenv но установленное python3.8 , хотел повозиться с пакетами, установленными на системном уровне, которые ему не нравились … короче говоря, включение virtualenv было лучшим доступным вариантом.. еще раз спасибо!

Ответ №2:

Почему бы просто не создать новый образ из ubuntu: 18.04 с желаемой конфигурацией, которая вам нужна? Вот так:

 FROM ubuntu:18.04
RUN apt update amp;amp; apt install software-properties-common -y
RUN add-apt-repository ppa:deadsnakes/ppa amp;amp; install python3.8 -y
RUN ln -s /usr/bin/pip3 /usr/bin/pip amp;amp; 
    ln -s /usr/bin/python3.8 /usr/bin/python
  

Комментарии:

1. Я на самом деле делаю все эти шаги, я пропустил те строки, где я добавляю deadsnakes:ppa , чтобы вопрос был коротким, позвольте мне попробовать это

2. он успешно создает образ, но, как я уже сказал, позже будет выполнен следующий шаг, на котором мы используем целевые объекты Makefile для установки зависимостей внутри контейнера, используя pip и pip-sync который завершается неудачей при не удается удалить ‘python-apt’.

3. Пожалуйста, не выполняйте отдельный запуск для apt update , это создает новый слой, который будет сохранен в кэше, что в некоторых ситуациях может привести к тому, что пакеты не будут найдены при попытке установить их позже.

Ответ №3:

Вы можете установить и включить свою версию python.

 # Python 3.8 and pip3
RUN apt-get update
RUN apt-get install -y software-properties-common
RUN add-apt-repository ppa:deadsnakes/ppa -y
RUN apt-get install -y python3.8
RUN ln -s /usr/bin/python3.8 /usr/bin/python
RUN apt-get install -y python3-pip
  

Комментарии:

1. когда я пробую эту версию, она просит меня ввести географическую область. Есть ли способ обойти это?

Ответ №4:

Иногда изменение ОС (например, получение новой Ubuntu clean os) не является благоприятным, поскольку текущая ОС слишком сложна. Например, моя базовая ОС ОТ ufoym / deepo: all-cu101.

Итак, чтобы изменить существующий python (3.6) на python 3.8, я добавил эти 2 строки:

 RUN apt-get update -qq   amp;amp; apt-get install -y -qq python3.8

RUN rm /usr/bin/python amp;amp; rm /usr/bin/python3 amp;amp; ln -s /usr/bin/python3.8 /usr/bin/python amp;amp;  ln -s /usr/bin/python3.8 /usr/bin/python3 
    amp;amp; rm /usr/local/bin/python amp;amp; rm /usr/local/bin/python3 amp;amp; ln -s /usr/bin/python3.8 /usr/local/bin/python amp;amp;  ln -s /usr/bin/python3.8 /usr/local/bin/python3 
    amp;amp; apt-get install -y python3-pip python-dev python3.8-dev amp;amp; python3 -m pip install pip --upgrade
  

Первым шагом является установка python3.8;
Второй шаг — изменить программную ссылку python и python3, чтобы она указывала на python3.8
После этого установите python3-pip и обновите его, чтобы убедиться, что pip использует текущую среду python 3.8.