Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Docker和PermissionError:[Errno 13]权限被拒绝:';output.svg';_Python_Docker - Fatal编程技术网

Python Docker和PermissionError:[Errno 13]权限被拒绝:';output.svg';

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' 首先,我认为问题出在路径上,但由于我只写当前目录,这应该足够了(尝试使用绝对路径,可能还有所有其他可能

我有一个flask应用程序和一个创建svg文件的函数。当我在本地运行时,一切正常,但使用Docker时,我一直运行到以下错误:

  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缓解错误。