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
,因为它是在运行期间创建的。
是否可以定义或更改
VOLUME
中Dockerfile
目录的默认所有者?我正在macOS和Linux上运行它。
#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
评论
相关:以正确的用户身份将卷共享给Docker。相关:如何管理在主机和容器之间共享数据的卷权限?