Bagaimana cara mengubah pemilik direktori VOLUME di Dockerfile?


11

Saya punya yang berikut ini 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

Yang saya bangun itu:

$ 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

Namun, ketika dijalankan, /opt/myvolumedirektori dimiliki oleh root, bukan 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

karena itu dibuat selama proses.

Apakah mungkin untuk mendefinisikan atau mengubah pemilik VOLUMEdirektori default Dockerfile?

Saya menjalankannya di macOS dan Linux.



Jawaban:


12

Seperti yang dinyatakan dalam dokumentasi , instruksi VOLUME mewarisi konten direktori dan izin yang ada di wadah, sehingga Anda dapat menyelesaikan masalah dengan buruh pelabuhan seperti ini:

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

Pembuatan direktori harus dilakukan sebagai root (untuk dapat menulis di dalam / opt).


Triknya sepertinya menentukan VOLUMEsetelah direktori dibuat: Jika langkah membangun apa pun mengubah data dalam volume setelah dideklarasikan, perubahan itu akan dibuang.
Jesse Glick

Pembuatan dir tidak terkait, volume akan dipasang keluar dari wadah sehingga apa pun yang dilakukan di dalam wadah sebelum pemasangan (wadah diluncurkan) akan dibuang. Saya benar-benar tidak mengerti komentar Anda
Tensibai

2

Saya memiliki masalah yang sama, ini bekerja untuk saya:

  1. Tulis file Docker dengan:

    # 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. Jalankan perintah bash ini:

    # 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
    

Perhatikan nama, UID, GID harus sama untuk pengguna Docker dan pengguna host. Perintah bash terakhir memberitahu gambar Docker bahwa pengguna host itu sama dengan pengguna volume bersama Docker, sehingga file dir kemudian menjadi milik "testuser" dalam wadah Docker.


JUGA, dalam beberapa lingkungan, SELinux dapat mencegah akses file. Ini dapat diatasi dengan menonaktifkan SELinux untuk sementara atau secara permanen (meskipun saya sangat menyarankan agar tidak menonaktifkan secara permanen). Panduan tentang ini dapat ditemukan di sini: tecmint.com/…
CubeBot88
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.