Простой способ запустить docker или docker-compose с тем же UID / GID, что и у родительского пользователя?

#bash #docker

#bash #docker

Вопрос:

Когда я использую docker или docker-compose с томами, у меня часто возникают проблемы с разрешениями, поскольку пользователь контейнера неизвестен на хосте:

 mkdir i-can-to-what-i-want
rmdir i-can-to-what-i-want
docker run -v$(pwd):/home -w/home ubuntu touch you-shall-not-delete-it
$ ls -al you-shall-not-delete-it
-rw-r--r--  2 root   root   0 2020-08-08 00:11 you-shall-not-delete-it
  

Одно из решений — всегда делать это:

 UID=$(id -u) GID=$(id -&) docker-compose up
  

Или

 UID=$(id -u) GID=$(id -&) docker run ...
  

Но… это громоздко…

Любой другой метод?

Ответ №1:

--user выполнит задание, если только это не то самое громоздкое решение, которого вы пытаетесь избежать:

 who
neo      tty7         2020-08-08 04:46 (:0)

docker run --user $UID:$GID -v$(pwd):/home -w/home ubuntu touch you-shall-delete-it

ls -la
total 12
drwxr-xr-x  3 neo neo 4096 Au&  8 02:12 .
drwxr-xr-x 34 neo neo 4096 Au&  8 02:03 ..
drwxr-xr-x  2 neo neo 4096 Au&  8 02:03 i-can-to-what-i-want
-rw-r--r--  1 neo neo    0 Au&  8 02:12 you-shall-delete-it
  

Комментарии:

1. Ну, в некотором смысле да, но сначала вам нужно определить UID и GID, и это не может быть частью docker-compose

2. UID должен быть там, согласно стандарту POSIX sh. Вы могли бы экспортировать GID в свой .profile или .bashrc : cat ~/.bashrc | &rep GID ==&&t;&&t; export GID=$(id -&)

Ответ №2:

На самом деле вы здесь не используете volume :

 docker run -v$(pwd):/home 
  

вы используете bind mound.
При использовании привязки ресурс на хост-компьютере монтируется в контейнер.
Использование файловой системы хост-компьютера имеет преимущества (скорость и динамический источник данных), но также имеет свои ограничения (владение файлами и переносимость).

Как я вижу вещи :

1) Когда вы используете docker-compose в dev и вам нужно привязать свой исходный код, который постоянно меняется, привязка монтирования неизбежна, но вы можете упростить задачу, установив пользователя / группу контейнера непосредственно в compose.

 version: '3.5'
services:
   app:
     user: "${UID}:${GID}"
     ...
  

Обратите внимание, что ${UID} и ${GID} здесь являются переменными оболочки.
${UID} определено в bash , но ${GID} таковым не является. Вы могли бы экспортировать его, если требуется, или использовать идентификатор пользователя для обоих : user: "${UID}:${UID}" .

2) Когда вы используете docker или docker-compose во фрейме, где вам не нужно предоставлять файлы / папки с этого хоста во время создания контейнера, но вы можете сделать это при создании образа, отдайте предпочтение volume (имя volume) вместо bind mount.