#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.