LoginSignup
59
64

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-09-29

この記事は

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ディレクトリの権限設定するべき を学んで良かったです

以上

59
64
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
59
64