我正在尝试在我的主机上的 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')
答案 0 :(得分:0)
看看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 :(得分:0)
您应该将证书字典挂载到 docker 容器中:
docker run -it --rm -v /etc/letsencrypt/live/domain.com:/certs -p 80:80 kaws/kaws_app:latest