Pip install не удается подтвердить SSL-сертификат: ошибка [SSL: CERTIFICATE_VERIFY_FAILED]

Добрый день, ребята.

Я создаю небольшой образ Python Docker для начинающих, использующих Ubuntu в Windows через WSL. В моем каталоге home/ есть каталог flask-app/ со следующими файлами:

Dockerfile

# our base image
FROM alpine:latest

# Install python and pip
RUN apk add --update py2-pip

# upgrade pip
RUN pip install --upgrade pip

# install Python modules needed by the Python app
COPY requirements.txt /usr/src/app/
RUN pip install --no-cache-dir -r /usr/src/app/requirements.txt

# copy files required for the app to run
COPY app.py /usr/src/app/
COPY templates/index.html /usr/src/app/templates/

# tell the port number the container should expose
EXPOSE 5000

# run the application
CMD ["python", "/usr/src/app/app.py"]

app.py

from flask import Flask, render_template
import random

app = Flask(__name__)

# list of cat images
images = [
    "http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr05/15/9/anigif_enhanced-buzz-26388-1381844103-11.gif",
    "http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr01/15/9/anigif_enhanced-buzz-31540-1381844535-8.gif",
    "http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr05/15/9/anigif_enhanced-buzz-26390-1381844163-18.gif",
    "http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr06/15/10/anigif_enhanced-buzz-1376-1381846217-0.gif",
    "http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr03/15/9/anigif_enhanced-buzz-3391-1381844336-26.gif",
    "http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr06/15/10/anigif_enhanced-buzz-29111-1381845968-0.gif",
    "http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr03/15/9/anigif_enhanced-buzz-3409-1381844582-13.gif",
    "http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr02/15/9/anigif_enhanced-buzz-19667-1381844937-10.gif",
    "http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr05/15/9/anigif_enhanced-buzz-26358-1381845043-13.gif",
    "http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr06/15/9/anigif_enhanced-buzz-18774-1381844645-6.gif",
    "http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr06/15/9/anigif_enhanced-buzz-25158-1381844793-0.gif",
    "http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr03/15/10/anigif_enhanced-buzz-11980-1381846269-1.gif"
]

@app.route('/')
def index():
    url = random.choice(images)
    return render_template('index.html', url=url)

if __name__ == "__main__":
    app.run(host = "0.0.0.0")

requirements.txt

Flask==1.0

templates/index.html

<html>
  <head>
    <style type = "text/css">
      body {
        background: black;
        color: white;
      }
      div.container {
        max-width: 500px;
        margin: 100px auto;
        border: 20px solid white;
        padding: 10px;
        text-align: center;
      }
      h4 {
        text-transform: uppercase;
      }
    </style>
  </head>
  <body>
    <div class = "container">
      <h4>Cat Gif of the day</h4>
      <img src = "{{url}}" />
      <p><small>Courtesy: <a href = "http://www.buzzfeed.com/copyranter/the-best-cat-gif-post-in-the-history-of-cat-gifs">Buzzfeed</a></small></p>
    </div>
  </body>
</html>

Когда я пытаюсь создать образ Docker с помощью docker build -t <MY_USERNAME>/myfirstapp ., я получаю следующую ошибку:

alain@testlab:~/flask-app$ docker build -t <MY_USERNAME>/myfirstapp .
[+] Building 3.5s (9/11)                                                                                                                                                                          docker:default
 => [internal] load build definition from Dockerfile                                                                                                                                                        0.0s
 => => transferring dockerfile: 566B                                                                                                                                                                        0.0s
 => [internal] load metadata for docker.io/library/alpine:3.5                                                                                                                                               0.8s
 => [internal] load .dockerignore                                                                                                                                                                           0.0s
 => => transferring context: 2B                                                                                                                                                                             0.0s
 => [1/7] FROM docker.io/library/alpine:3.5@sha256:66952b313e51c3bd1987d7c4ddf5dba9bc0fb6e524eed2448fa660246b3e76ec                                                                                         0.0s
 => [internal] load build context                                                                                                                                                                           0.0s
 => => transferring context: 2.46kB                                                                                                                                                                         0.0s
 => CACHED [2/7] RUN apk add --update py2-pip                                                                                                                                                               0.0s
 => [3/7] RUN pip install --upgrade pip                                                                                                                                                                     1.3s
 => [4/7] COPY requirements.txt /usr/src/app/                                                                                                                                                               0.1s
 => ERROR [5/7] RUN pip install --no-cache-dir -r /usr/src/app/requirements.txt                                                                                                                             1.2s
------
 > [5/7] RUN pip install --no-cache-dir -r /usr/src/app/requirements.txt:
0.874 Collecting Flask==1.0 (from -r /usr/src/app/requirements.txt (line 1))
0.949   Could not fetch URL https://pypi.python.org/simple/flask/: There was a problem confirming the ssl certificate: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:726) - skipping
0.950   Could not find a version that satisfies the requirement Flask==1.0 (from -r /usr/src/app/requirements.txt (line 1)) (from versions: )
0.951 No matching distribution found for Flask==1.0 (from -r /usr/src/app/requirements.txt (line 1))
------
Dockerfile:12
--------------------
  10 |     # install Python modules needed by the Python app
  11 |     COPY requirements.txt /usr/src/app/
  12 | >>> RUN pip install --no-cache-dir -r /usr/src/app/requirements.txt
  13 |
  14 |     # copy files required for the app to run
--------------------
ERROR: failed to solve: process "/bin/sh -c pip install --no-cache-dir -r /usr/src/app/requirements.txt" did not complete successfully: exit code: 1

Я пробовал это решение с флагом --trusted-host и другое решение, но пока у меня та же проблема.

Поскольку некоторые версии TSL устарели в Python, я обязательно обновил pip до последней версии с помощью curl https://bootstrap.pypa.io/get-pip.py | python3.

Это моя текущая версия пипа:

alain@testlab:~/flask-app$ pip --version
pip 24.2 from /home/alain/.local/lib/python3.10/site-packages/pip (python 3.10)

Это мой текущий Python и его версия OpenSSL:

alain@testlab:~/flask-app$ python3 -c "import ssl; print(ssl.OPENSSL_VERSION)"
OpenSSL 3.0.2 15 Mar 2022

Что может произойти?

Заранее огромное спасибо!

Есть ли какие-то конкретные причины, по которым вы используете alpine:3.5 вместо последних версий?

alko 14.08.2024 17:52

Нет @alko, без особой причины. Я поменял его на последнюю версию, и конечный результат тот же. Но спасибо за наблюдение.

Alain 14.08.2024 18:06
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Официальный python на Dockerhub включает версии, использующие alpine; это сэкономит вам несколько шагов.

Возможно:

Убедитесь, что вы используете последнюю версию Flask.

requirements.txt:

Flask==3.0.3

Dockerfile:

# our base image
FROM docker.io/python:3.12.5-alpine3.19

# Using WORKDIR is more idiomatic and saves repeated use of the folder
WORKDIR /usr/src/app

# install Python modules needed by the Python app
COPY requirements.txt .
RUN pip install --no-cache-dir -r ./requirements.txt

# copy files required for the app to run
COPY app.py .
COPY templates/index.html ./templates/

# tell the port number the container should expose
EXPOSE 5000

# run the application
CMD ["python", "app.py"]
Q=78871861

docker build \
--tag=stackoverflow:${Q} \
--file=${PWD}/Dockerfile \
${PWD}

docker run \
--interactive --tty --rm \
--publish=5000:5000/tcp \
stackoverflow:${Q}
 * Serving Flask app 'app'
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:5000
 * Running on http://10.0.2.100:5000
Press CTRL+C to quit
10.0.2.100 - - [14/Aug/2024 16:13:35] "GET / HTTP/1.1" 200 -
10.0.2.100 - - [14/Aug/2024 16:13:36] "GET / HTTP/1.1" 200 -
10.0.2.100 - - [14/Aug/2024 16:13:37] "GET / HTTP/1.1" 200 -
10.0.2.100 - - [14/Aug/2024 16:13:38] "GET / HTTP/1.1" 200 -

А затем просмотрите http://localhost:5000

Спасибо за ваш ответ @DazWilkin. Вот что я получаю: Traceback (most recent call last):File "/usr/src/app/app.py", line 1, in <module>from flask import Flask, render_templateFile "/usr/local/lib/python3.12/site-packages/flask/__init__.py", line 19, in <module>from jinja2 import Markup, escapeImportError: cannot import name 'Markup' from 'jinja2' (/usr/local/lib/python3.12/site-packages/jinja2/__init__.py)

Alain 15.08.2024 03:53

На самом деле, одно (важное) изменение (которое я забыл включить) заключается в том, что вы должны использовать последнюю версию Flask.... Flask==3.0.3 в вашем файле require.txt. Я обновлю ответ.

DazWilkin 15.08.2024 04:45

Да, я подтвердил, что если вы используете старую версию Flask=-1.0, вы получите показанные вами ошибки. Пожалуйста, убедитесь, что вы используете Flask==3.0.3

DazWilkin 15.08.2024 04:48

Работаю как обаяние @DazWilkin. Большое спасибо, сэр!

Alain 15.08.2024 04:56

Пожалуйста. Извините за оплошность Flask==3.0.3.

DazWilkin 15.08.2024 05:03

Другие вопросы по теме