我有以下Dockerfile

FROM ubuntu:xenial
RUN useradd -d /home/ubuntu -ms /bin/bash -g root -G sudo -p ubuntu ubuntu
WORKDIR /home/ubuntu
USER ubuntu
VOLUME /opt/myvolume


我建造的:

$ docker build -t vol-test .
Sending build context to Docker daemon  2.048kB
Step 1/5 : FROM ubuntu:xenial
 ---> 0b1edfbffd27
Step 2/5 : RUN useradd -d /home/ubuntu -ms /bin/bash -g root -G sudo -p ubuntu ubuntu
 ---> Using cache
 ---> d82e3ecc5fe8
Step 3/5 : WORKDIR /home/ubuntu
 ---> Using cache
 ---> ab1db29ee8bf
Step 4/5 : USER ubuntu
 ---> Using cache
 ---> 129393a35d9e
Step 5/5 : VOLUME /opt/myvolume
 ---> Running in 691a4cbd077e
Removing intermediate container 691a4cbd077e
 ---> 11bc9e9db9d3
Successfully built 11bc9e9db9d3
Successfully tagged vol-test:latest


但是,何时运行时,/opt/myvolume目录归root而非ubuntu拥有:

$ docker run vol-test id
uid=1000(ubuntu) gid=0(root) groups=0(root),27(sudo)
$ docker run vol-test find /opt/myvolume -ls
    66659      4 drwxr-xr-x   2 root     root         4096 Jul 18 23:02 /opt/myvolume
$ docker run -u ubuntu vol-test find /opt/myvolume -ls
    66940      4 drwxr-xr-x   2 root     root         4096 Jul 18 23:12 /opt/myvolume


,因为它是在运行期间创建的。

是否可以定义或更改VOLUMEDockerfile目录的默认所有者?

我正在macOS和Linux上运行它。

评论

相关:以正确的用户身份将卷共享给Docker。

相关:如何管理在主机和容器之间共享数据的卷权限?

#1 楼

如文档中所述,VOLUME指令继承了容器中现有的目录内容和权限,因此您可以使用以下dockerfile解决此问题:

FROM ubuntu:xenial
RUN useradd -d /home/ubuntu -ms /bin/bash -g root -G sudo -p ubuntu ubuntu
RUN mkdir /opt/myvolume  && chown ubuntu /opt/myvolume
WORKDIR /home/ubuntu
VOLUME /opt/myvolume


创建目录必须以root用户身份完成(才能在/ opt中写入)。

评论


创建目录后,似乎在指定VOLUME的技巧:如果在声明了卷之后,任何构建步骤更改了卷中的数据,则这些更改将被丢弃。

–杰西·格里克(Jesse Glick)
19年6月21日在20:28



目录创建是无关的,一个卷将从容器中装入,因此在装入(容器启动)之前在容器内完成的所有操作都将被丢弃。我不太明白你的评论

–滕西拜
19年6月22日在8:27



#2 楼

我有一个类似的问题,这对我有用:



用以下方法编写Docker文件:

# Create app layer:
FROM python:3.4
# Create app user & group "testuser" with IDs:
RUN groupadd -r testuser --gid 1234 && useradd -d /home/testuser -ms /bin/bash -r -g testuser testuser --uid 1234
# Create "testuser" working dir:
WORKDIR /home/testuser
# Make working dir known to Python    
ENV PYTHONPATH "${PYTHONPATH}:/home/testuser"
# Create & mount shared storage:
RUN mkdir /var/run/testuser-storage
VOLUME ["/var/run/testuser-storage"]
# Start container as "testuser":
ENV NAME testuser
ENV HOME /home/testuser
USER testuser



运行以下bash命令:

# Create the same user & group "testuser" with IDs on host:
getent group testuser > /dev/null || /usr/sbin/groupadd -r testuser --gid 1234
getent passwd testuser > /dev/null || /usr/sbin/useradd -r -g testuser -d /var/lib/testuser -s /bin/nologin testuser --uid 1234
# Create shared storage dirs on host:
mkdir /var/run/testuser-storage
chown -R testuser.testuser /var/run/testuser-storage
# Build and run "testuser" Docker image:
docker build . -t testuser
docker run --net host --name testuser -v /var/run/testuser-storage:/var/run/testuser-storage -d testuser
# Change ownership of shared volume dir to the be the GID of "testuser"
chown -R 1234:1234 /var/run/testuser-storage



请注意,Docker用户和主机用户的名称,UID,GID必须相同。最后一个bash命令告诉Docker映像,该主机用户与Docker共享卷dir用户相同,因此该文件dir由Docker容器中的“ testuser”拥有。

评论


另外,在某些环境下,SELinux可以阻止文件访问。可以通过暂时或永久禁用SELinux来解决此问题(尽管我强烈建议不要永久禁用SELinux)。关于此的指南可以在这里找到:tecmint.com/…

– CubeBot88
18年9月9日在6:59