Python Docker和PermissionError:[Errno 13]权限被拒绝:';output.svg';
我有一个flask应用程序和一个创建svg文件的函数。当我在本地运行时,一切正常,但使用Docker时,我一直运行到以下错误:Python Docker和PermissionError:[Errno 13]权限被拒绝:';output.svg';,python,docker,Python,Docker,我有一个flask应用程序和一个创建svg文件的函数。当我在本地运行时,一切正常,但使用Docker时,我一直运行到以下错误: File "app.py", line 91, in get_svg svg_f = open("output.svg", "w+") PermissionError: [Errno 13] Permission denied: 'output.svg' 首先,我认为问题出在路径上,但由于我只写当前目录,这应该足够了(尝试使用绝对路径,可能还有所有其他可能
File "app.py", line 91, in get_svg
svg_f = open("output.svg", "w+")
PermissionError: [Errno 13] Permission denied: 'output.svg'
首先,我认为问题出在路径上,但由于我只写当前目录,这应该足够了(尝试使用绝对路径,可能还有所有其他可能的选项)
该函数只有打开文件并写入文件的标准方式
svg_f = open("output.svg", "w+")
svg_f.write(f'<svg width="{w}" height="{h}" xmlns="http://www.w3.org/2000/svg">')
....
svg_f.close()
svg\u f=open(“output.svg”、“w+”)
svg_f.写入(f'')
....
svg_f.close()
可能是什么原因造成的?请确保
Dockerfile
没有指定可能没有在您的应用程序中写入的权限。注释也是相关的(装载量和容器作为低优先级用户运行)。下面是一个简单的基线图像示例,您可以使用它进行调试
Dockerfile
FROM python:3.8-alpine
RUN mkdir /app
COPY app.py /app
WORKDIR /app
ENTRYPOINT ["python3"]
CMD ["/app/app.py"]
app.py
w=1
将open('output.svg','w+')作为fw:
fw.write(f'确保Dockerfile
没有指定可能没有在您的中写入的权限。注释也相关(装入的卷和容器以低权限用户身份运行)。下面是一个简单的图像示例,用于调试基线
Dockerfile
FROM python:3.8-alpine
RUN mkdir /app
COPY app.py /app
WORKDIR /app
ENTRYPOINT ["python3"]
CMD ["/app/app.py"]
app.py
w=1
将open('output.svg','w+')作为fw:
write(f'我正在使用Fedora32,我不得不暂时禁用SELinux
$ sudo setenforce 0
我正在使用Fedora 32,我不得不暂时禁用SELinux
$ sudo setenforce 0
我猜该文件已经在docker容器中创建,当前用户没有写入该文件的权限。在容器中,运行ls-al
。请先检查文件权限。如果您仍然无法确定,请将结果包含在问题中,并输出id
。我假设(a)您正在将output.svg
写入绑定装载的卷;(b)您的容器以非根用户身份运行。如果是这样,则Flask进程可能以“其他”身份运行。您可以通过主机上的chmod o+w
来测试这一点(!)装载到容器的目录。我没有将output.svg
写入任何卷,我只是临时创建它,然后使用os.remove('output.svg'))
因为我只需要通过api传递它,然后我就完成了。我知道docker不存储任何持久数据,但它应该正确处理这个问题?我猜文件已经在docker容器中创建,当前用户没有写入它的权限。在容器内,运行ls-al
。请首先检查文件权限。如果您仍然无法理解,请将结果包含在问题和id
的输出中。我假设(a)您正在将output.svg
写入绑定装入的卷;(b)您的容器正在以非root用户的身份运行。如果是这样,Flask进程很可能以“其他”的身份运行。您可以在装载到容器的主机(!)目录上通过chmod o+w
进行测试。我没有将output.svg
写入任何卷,我只是临时创建它,然后使用os.remove('output.svg'))
因为我只需要通过api传递它,然后就完成了。我知道docker不存储任何持久数据,但它应该能正确处理这个问题吗?嗯,我几乎有完全相同的设置,但我一直运行到提供的预任务错误。嗯,我几乎有完全相同的设置,但我一直运行到提供的p缓解错误。