DockerfileのVOLUMEディレクトリの所有者を変更するにはどうすればよいですか?


11

私は次のものを持っています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で実行しています。



回答:


12

ドキュメントに記載されているように、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

ディレクトリの作成は、ルートとして実行する必要があります(/ opt内に書き込むことができるようにするため)。


トリックはVOLUME、ディレクトリが作成された後に指定されているようです:ビルドステップが宣言された後にボリューム内のデータを変更した場合、それらの変更は破棄されます。
Jesse Glick

dirの作成は無関係であり、ボリュームはコンテナーからマウントされるため、マウント(コンテナーの起動)の前にコンテナー内で行われたことはすべて破棄されます。私はあなたのコメントを本当に理解していません
Tensibai

2

私は同様の問題がありました、これは私のために働きました:

  1. 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
    
  2. 次の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
    

名前、UID、GIDは、Dockerユーザーとホストユーザーで同じである必要があります。最後のbashコマンドは、そのホストユーザーがDocker共有ボリュームのdirユーザーと同じであることをDockerイメージに通知し、ファイルdirがDockerコンテナー内の「testuser」によって所有されるようになります。


また、一部の環境では、SELinuxがファイルアクセスを妨げる可能性があります。これは、SELinuxを一時的または永続的に無効にすることで解決できます(ただし、永続的に無効にすることは強くお勧めします)。これに関するガイドは、tecmint.com
CubeBot88の
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.