Help us understand the problem. What is going on with this article?

Docker Composeのvolumes使用時に出会うpermission deniedに対応する一つの方法

この記事は

Linux上で.envとDocker Composeを使ったvolumesの権限設定を紹介したいと思います

書く理由は

Linux上でDocker Composeを使ったvolumesの設定で権限で怒られたから

権限で怒らないためには

host(Docker Composeを動かす方)のLinux user id、group idとコンテナの中のvolumesのuser idとgroup idが異なるからです。
これらを同じくすれば治りました

対応内容

  1. setDotEnv.shを実行して、hostのLinux user id、group id、user nameを.envに書いておく
  2. docker-compose.ymlのargsを使って、.envにあるuser id、group id、user nameをDockerFileに渡す
  3. DockerFileはdocker-compose.ymlからargsを通じて渡されたuser id、group id、user nameを使って、Dockerコンテナの中の環境変数を設定します
  4. Dockerコンテナに設定された環境変数を使って、hostと同じuser id、group id、user nameを持つユーザーを作ります
  5. user: $UID:$GID オプションを使って、DockerコンテナにログインするユーザーをhostのLinux userと同じくします。(defaultはrootユーザーです)
  6. DockerFileのENTRYPOINTを使って、Dockerコンテナ生成された後に、shell script(setVolumePermission.sh)を実行してvolumesの権限を設定します
    • Dockerコンテナが生成される前は、volumesされるディレクトリがありません。
    • noEntrypoint1.png
  • DockerFileでvolumesするディレクトリをmkidrで作って権限を設定しても無視されます。

結果

hostのLinuxユーザーはvagrant、Dockerコンテナの中で確認したvolumesディレクトリもvagrantで、ちゃんと設定されました
withEntrypoint1.PNG

環境

Linux

  • NAME : Kali GNU/Linux
  • VERSION : 2019.1

Docker Compose

  • VERSION : 1.23.1

Docker

  • VERSION : 18.09.4

構成図

dirs.PNG

setDotEnv.sh

#!/bin/sh

touch .env
echo "UID=$(id -u $USER)" >> .env
echo "GID=$(id -g $USER)" >> .env
echo "UNAME=$USER" >> .env

.env(setDotEnv.shから作られました)

UID=1000
GID=1000
UNAME=vagrant

docker-compose.yml

version: '3'
services:
  dot-env-entrypoint-docker-volumes:
    container_name: 'dot-env-entrypoint-docker-volumes'
    user: $UID:$GID
    build:
      context: .
      args:
        UID: $UID
        GID: $GID
        UNAME: $UNAME
    tty: true

    working_dir: '/home/$UNAME'
    volumes:
      - ./workspace:/home/$UNAME/workspace

Dockerfile

FROM amazonlinux:2

RUN \
  yum -y update \
  && yum -y install systemd procps openssh-server passwd sudo vim git wget unzip \
  && yum clean all \
  && cp -f /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

ENV LANG ja_JP.UTF-8
ENV LC_ALL C

ARG UID
ARG GID
ARG UNAME

ENV UID ${UID}
ENV GID ${GID}
ENV UNAME ${UNAME}

RUN groupadd -g ${GID} ${UNAME}
RUN useradd -u ${UID} -g ${UNAME} -m ${UNAME}

COPY ./setVolumePermission.sh /home/${UNAME}
RUN chmod +x /home/${UNAME}/setVolumePermission.sh

ENTRYPOINT ["sh", "-c", "/home/${UNAME}/setVolumePermission.sh"]

setVolumePermission.sh

#!/bin/sh

chown ${UNAME}:${UNAME} -R /home/${UNAME}

/bin/bash

コメント

docker-compose.ymlでのvolumesディレクトリの権限設定はDockerコンテナ生成された後に、volumesディレクトリの権限設定するべき を学んで良かったです

以上

fusic
個性をかき集めて、驚きの角度から世の中をアップデートしつづける。
https://fusic.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした