【问题标题】:Docker | access host file in python within docker container码头工人 |在 docker 容器中访问 python 中的主机文件
【发布时间】:2021-04-12 21:19:48
【问题描述】:

我正在尝试在 docker 容器中访问我的主机上的 certbot ssl 证书。 我的认证位于 /etc/letsencrypt/live/domain.com 我正在使用 args 加载我的容器:

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

我在 docker 容器中的 python 脚本说找不到文件或目录。 我正在尝试加载 /etc/letsencrypt/live/domain.com/ 中存在的证书

我收到的错误是:

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

如何从 docker 容器中的 python 脚本访问主机上的文件?

Dockerfile

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

RUN \
  apk add --no-cache python3 py3-pip \
  && apk upgrade --update \
  && apk add git \
  && apk add --update alpine-sdk \
  && apk add libffi-dev openssl-dev \
  && 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')

【问题讨论】:

  • 你运行的是哪个操作系统?
  • 你确定/etc/letsencrypt/live/domain.com/fullchain.pem/etc/letsencrypt/live/domain.com/privkey.pem存在吗?
  • @jtlz2 我正在运行 ubuntu 20.04。我确定文件存在,我可以 cat/print 它们。
  • python 进程是否具有列出该目录中这些文件所需的权限?
  • @jtlz2 我将尝试为目录中的文件添加权限,然后重试。感谢您的宝贵时间

标签: python docker ssl certbot


【解决方案1】:

您应该将证书字典挂载到 docker 容器中:

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

【讨论】:

  • -v 的第三个参数不是用于读/写等吗?
  • 这不是我在做的吗?
【解决方案2】:

查看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 上这样做)。

【讨论】:

  • 抱歉,打错了。我在 ubunut 20.04
  • 你能分享 dockerfile 吗?
  • @ThanhNguyenVan 编辑并添加了 dockerfile
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-17
  • 2017-02-18
相关资源
最近更新 更多