この記事は
Linux上で.envとDocker Composeを使ったvolumesの権限設定を紹介したいと思います
書く理由は
Linux上でDocker Composeを使ったvolumesの設定で権限で怒られたから
権限で怒らないためには
host(Docker Composeを動かす方)のLinux user id、group idとコンテナの中のvolumesのuser idとgroup idが異なるからです。
これらを同じくすれば治りました
対応内容
- setDotEnv.shを実行して、hostのLinux user id、group id、user nameを.envに書いておく
- docker-compose.ymlのargsを使って、.envにあるuser id、group id、user nameをDockerFileに渡す
- docker-compose.ymlでbuildを使用する場合、env_fileを使ってDockerFileに環境変数を渡せません。( https://docs.docker.com/compose/compose-file/#env_file )
- DockerFileはdocker-compose.ymlからargsを通じて渡されたuser id、group id、user nameを使って、Dockerコンテナの中の環境変数を設定します
- Dockerコンテナに設定された環境変数を使って、hostと同じuser id、group id、user nameを持つユーザーを作ります
-
user: $UID:$GID
オプションを使って、DockerコンテナにログインするユーザーをhostのLinux userと同じくします。(defaultはrootユーザーです) - DockerFileのENTRYPOINTを使って、Dockerコンテナ生成された後に、shell script(setVolumePermission.sh)を実行してvolumesの権限を設定します
結果
hostのLinuxユーザーはvagrant、Dockerコンテナの中で確認したvolumesディレクトリもvagrantで、ちゃんと設定されました
環境
Linux
- NAME : Kali GNU/Linux
- VERSION : 2019.1
Docker Compose
- VERSION : 1.23.1
Docker
- VERSION : 18.09.4
構成図
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ディレクトリの権限設定するべき
を学んで良かったです