Làm cách nào để thay đổi chủ sở hữu của thư mục VOLUME trong Dockerfile?


11

Tôi đã có những điều sau đây 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

Mà tôi đã xây dựng nó:

$ 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

Tuy nhiên, khi chạy, /opt/myvolumethư mục được sở hữu bởi root, không phải 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

bởi vì nó được tạo ra trong quá trình chạy.

Có thể xác định hoặc thay đổi chủ sở hữu mặc định của VOLUMEthư mục trong Dockerfile?

Tôi đang chạy nó trên macOS và Linux.



Câu trả lời:


12

Như đã nêu trong tài liệu , hướng dẫn VOLUME kế thừa nội dung thư mục và các quyền hiện có trong vùng chứa, do đó bạn có thể khắc phục sự cố với dockerfile như sau:

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

Việc tạo thư mục phải được thực hiện dưới quyền root (để có thể ghi trong / opt).


Thủ thuật dường như được chỉ định VOLUMEsau khi thư mục được tạo: Nếu bất kỳ bước xây dựng nào thay đổi dữ liệu trong ổ đĩa sau khi được khai báo, những thay đổi đó sẽ bị loại bỏ.
Jesse Glick

Việc tạo dir không liên quan, một khối sẽ được gắn ra khỏi container để mọi thứ được thực hiện trong container trước khi mount (container được khởi chạy) sẽ bị loại bỏ. Tôi thực sự không hiểu nhận xét của bạn
Tensibai

2

Tôi đã có một vấn đề tương tự, điều này làm việc cho tôi:

  1. Viết tập tin Docker với:

    # 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
    
  2. Chạy các lệnh bash này:

    # 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
    

Lưu ý tên, UID, GID phải giống nhau cho người dùng Docker và người dùng máy chủ. Lệnh bash cuối cùng cho hình ảnh Docker biết rằng người dùng máy chủ đó giống như người dùng dir khối lượng chia sẻ Docker, do đó, tập tin dir sau đó được sở hữu bởi "người kiểm tra" trong bộ chứa Docker.


CSONG, trong một số môi trường, SELinux có thể ngăn truy cập tệp. Điều này có thể được giải quyết bằng cách vô hiệu hóa tạm thời hoặc vĩnh viễn Selinux (mặc dù tôi đặc biệt khuyên không nên vô hiệu hóa vĩnh viễn). Hướng dẫn về điều này có thể được tìm thấy ở đây: tecmint.com/ Kẻ
CubeBot88
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.