我有一个包含分析管道的Docker映像。要运行此管道,我需要提供输入数据,并且要保留输出。该管道必须能够由本人以外的其他用户在自己的笔记本电脑上运行。
简而言之,我的根(/)文件夹结构如下:
total 72
drwxr-xr-x 1 root root 4096 May 29 15:38 bin
drwxr-xr-x 2 root root 4096 Feb 1 17:09 boot
drwxr-xr-x 5 root root 360 Jun 1 15:31 dev
drwxr-xr-x 1 root root 4096 Jun 1 15:31 etc
drwxr-xr-x 2 root root 4096 Feb 1 17:09 home
drwxr-xr-x 1 root root 4096 May 29 15:49 lib
drwxr-xr-x 2 root root 4096 Feb 24 00:00 lib64
drwxr-xr-x 2 root root 4096 Feb 24 00:00 media
drwxr-xr-x 2 root root 4096 Feb 24 00:00 mnt
drwxr-xr-x 1 root root 4096 Mar 12 19:38 opt
drwxr-xr-x 1 root root 4096 Jun 1 15:24 pipeline
dr-xr-xr-x 615 root root 0 Jun 1 15:31 proc
drwx------ 1 root root 4096 Mar 12 19:38 root
drwxr-xr-x 3 root root 4096 Feb 24 00:00 run
drwxr-xr-x 1 root root 4096 May 29 15:38 sbin
drwxr-xr-x 2 root root 4096 Feb 24 00:00 srv
dr-xr-xr-x 13 root root 0 Apr 29 10:14 sys
drwxrwxrwt 1 root root 4096 Jun 1 15:25 tmp
drwxr-xr-x 1 root root 4096 Feb 24 00:00 usr
drwxr-xr-x 1 root root 4096 Feb 24 00:00 var
管道脚本位于/ pipeline中,并通过Dockerfile中的“ COPY。/ pipeline”指令打包到映像中。
出于各种原因,设置了该管道(这是旧管道),因此输入数据必须位于诸如/ pipeline / project的文件夹中。要运行我的管道,我使用:
docker run --rm --mount type=bind,source=$(pwd),target=/pipeline/project --user "$(id -u):$(id -g)" pipelineimage:v1
换句话说,我将包含数据的文件夹安装到/ pipeline / project。我发现我需要使用--user来确保输出文件具有正确的权限-即,在容器退出后,我将对主机具有读/写/ exec访问权限。
管道正在运行,但我有一个问题:管道使用的一种特定软件会自动尝试在$ HOME中生成(但我无法更改)1个文件夹(所以,我在上面显示了-),我的WORKDIR中的1个文件夹(我在Dockerfile中将其设置为/ pipeline)。这些尝试失败了,我猜是因为我没有以root身份运行管道。但是我需要使用--user来确保我的输出具有正确的权限-即,我不需要sudo权限来读取这些输出,等等。
我的问题是:我打算如何处理?似乎通过使用--user,我为已成功创建许多输出文件的已安装文件夹(/ pipeline / projects)设置了正确的权限,在那里没有问题。但是如何确保其他2个文件夹是在该安装之外正确创建的?
我尝试了以下但未成功的方法:
我想念什么吗?我不明白为什么对已安装文件夹的权限进行“操作”容易,而对容器中其他文件夹的处理却如此困难。谢谢。
如果您的软件不依赖相对路径(~/
,./
),则只需将$HOME
和WORKDIR
设置为任何用户都可以写入的目录:
ENV HOME=/tmp
WORKDIR /tmp
[如果无法这样做,则可以通过环境将uid / gid传递给以root身份运行的入口点脚本,必要时使用chown / chmod,然后放弃特权以运行管道(runuser
,su
, sudo
,setuidgid
)。