Docker | доступ к файлу хоста на python в контейнере docker

#python #docker #ssl #certbot

#python #docker #ssl #certbot

Вопрос:

Я пытаюсь получить доступ к SSL-сертификатам certbot на моем хост-компьютере в контейнере docker. Мои сертификаты находятся в /etc/letsencrypt/live/domain.com Я загружаю свой контейнер, используя аргументы:

docker run -v /etc/letsencrypt/live/domain.com:/certs -it --rm -p 80:80 kaws/kaws_app:latest

Мой скрипт python в контейнере docker сообщает, что файлы или каталоги не найдены. Я пытаюсь загрузить сертификаты, которые существуют в /etc/letsencrypt/live/domain.com/

Ошибка, которую я получаю, гласит:

 ssl_context.load_cert_chain('/certs/fullchain.pem', '/certs/privkey.pem')
FileNotFoundError: [Errno 2] No such file or directory
 

Как мне получить доступ к файлам на моем хост-компьютере из моего скрипта python в моем контейнере docker?

Dockerfile

 # Use the official Python 3 image.
# https://hub.docker.com/_/python
FROM python:3-alpine

RUN 
  apk add --no-cache python3 py3-pip 
  amp;amp; apk upgrade --update 
  amp;amp; apk add git 
  amp;amp; apk add --update alpine-sdk 
  amp;amp; apk add libffi-dev openssl-dev 
  amp;amp; apk --no-cache --update add build-base

COPY . /app

# Create and change to the app directory.
WORKDIR /app

RUN apk add --no-cache --virtual .build-deps 
  gcc musl-dev

RUN pip install --no-cache-dir -r requirements.txt

# Cleanup dev dependencies
RUN apk del -f .build-deps

RUN chmod 444 app.py
RUN chmod 444 requirements.txt

# Service must listen to $PORT environment variable.
# This default value facilitates local development.
ENV PORT 80
ENV PORT 443

# Run the web service on container startup.
CMD [ "python", "app.py" ]
 

Обновление:
Я запустил следующий код в своем скрипте python, чтобы посмотреть, может ли он видеть сертификаты и может ли он их видеть, но он по-прежнему выдает ошибку.

 for root, dirs, files in os.walk("/certs"):
    for filename in files:
        print(filename)
 

Вывод:

 docker run kaws/kaws_app:latest
chain.pem
fullchain.pem
privkey.pem
cert.pem
README
Traceback (most recent call last):
  File "/app/app_pusher.py", line 83, in <module>
    ssl_context.load_cert_chain('/certs/fullchain.pem', '/certs/privkey.pem')
 

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

1. Какую ОС вы используете?

2. Вы уверены /etc/letsencrypt/live/domain.com/fullchain.pem и /etc/letsencrypt/live/domain.com/privkey.pem существуете?

3. @jtlz2 Я использую ubuntu 20.04. Я уверен, что файлы существуют, я могу их просмотреть / распечатать.

4. Имеет ли процесс python необходимые разрешения для перечисления этих файлов в этом каталоге?

5. @jtlz2 Я попробую добавить разрешения к файлам в каталоге и повторю попытку. Спасибо за ваше время

Ответ №1:

Глядя на https://docs.docker.com/storage/volumes/#choose-the—v-or—mount-flag , вам нужно отбросить : » после /certs «.

Затем ваша команда

docker run -v /etc/letsencrypt/live/domain.com:/certs -it --rm -p 80:80 kaws/kaws_app:latest

Возможно, вам также потребуется включить общий доступ в вашей ОС (вы делаете это в macOS).

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

1. извините, это была опечатка. я нахожусь на ubunut 20.04

2. можете ли вы поделиться файлом dockerfile?

3. @ThanhNguyenVan отредактировал и добавил dockerfile

Ответ №2:

Вы должны смонтировать словарь сертификатов в контейнер docker:

 docker run -it --rm -v /etc/letsencrypt/live/domain.com:/certs -p 80:80 kaws/kaws_app:latest
 

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

1. Разве это не третий аргумент -v для чтения / записи и т.д.?

2. разве это не то, что я делаю?