Оновлення 28.09.2015
Я помітив, що цей пост привертає трохи уваги. Порада всім, хто потенційно зацікавлений зробити щось подібне. Я спробував би використовувати Python або іншу мову як обгортку для виконання скриптів. Виконуючи власні скрипти bash, у мене виникали проблеми при спробі передати різні аргументи своїм контейнерам. Зокрема, були проблеми з інтерпретацією / екрануванням символів "і" за допомогою оболонки.
Мені потрібно було змінити користувача з трохи іншої причини.
Я створив образ докера, що містить повнофункціональну установку ImageMagick та Ffmpeg, бажаючи, щоб я міг перетворити зображення / відео в моїй хост-ОС. Моя проблема полягала в тому, що це інструменти командного рядка, тому трохи складніше виконати їх через докер, а потім повернути результати назад в основну ОС. Мені вдалося дозволити це, встановивши докерний том. Здавалося, це працювало нормально, за винятком того, що вихід зображення / відео виходив як власник root (тобто користувачеві, в якому запущений контейнер докера), а не користувачеві, який виконав команду.
Я подивився на підхід, який @ François Zaninotto згадав у своїй відповіді (повний сценарій make ви можете переглянути тут ). Це було справді круто, але я віддав перевагу варіанту створення скрипта оболонки bash, який потім зареєстрував би на своєму шляху. Я взяв деякі концепції з підходу Makefile (зокрема створення користувача / групи), а потім створив сценарій оболонки.
Ось приклад мого сценарію оболонки dockermagick :
#!/bin/bash
DOCKER_IMAGE='acleancoder/imagemagick-full:latest'
CONTAINER_USERNAME='dummy'
CONTAINER_GROUPNAME='dummy'
HOMEDIR='/home/'$CONTAINER_USERNAME
GROUP_ID=$(id -g)
USER_ID=$(id -u)
create_user_cmd()
{
echo \
groupadd -f -g $GROUP_ID $CONTAINER_GROUPNAME '&&' \
useradd -u $USER_ID -g $CONTAINER_GROUPNAME $CONTAINER_USERNAME '&&' \
mkdir --parent $HOMEDIR '&&' \
chown -R $CONTAINER_USERNAME:$CONTAINER_GROUPNAME $HOMEDIR
}
execute_as_cmd()
{
echo \
sudo -u $CONTAINER_USERNAME HOME=$HOMEDIR
}
full_container_cmd()
{
echo "'$(create_user_cmd) && $(execute_as_cmd) $@'"
}
eval docker run \
--rm=true \
-a stdout \
-v $(pwd):$HOMEDIR \
-w $HOMEDIR \
$DOCKER_IMAGE \
/bin/bash -ci $(full_container_cmd $@)
Цей сценарій прив'язаний до зображення "acleancoder / imagemagick-full", але це можна змінити, редагуючи змінну у верхній частині сценарію.
В основному він робить це:
- Створіть ідентифікатор користувача та групу в контейнері, щоб відповідати користувачеві, який виконує сценарій із хост-ОС .
- Встановлює поточний робочий каталог приймаючої ОС (використовуючи томи докера) у домашній каталог для користувача, якого ми створюємо у виконаному контейнері докера .
- Встановлює каталог tmp як робочий каталог контейнера .
- Передає будь-які аргументи, які передаються сценарію, які потім виконуються за допомогою ' / bin / bash ' виконуваного контейнера докера .
Тепер я можу запускати команди ImageMagick / Ffmpeg проти файлів на моїй хост-ОС. Наприклад, скажімо, що я хочу перетворити зображення MyImage.jpeg у файл PNG , тепер я можу зробити наступне:
$ cd ~/MyImages
$ ls
MyImage.jpeg
$ dockermagick convert MyImage.jpeg Foo.png
$ ls
Foo.png MyImage.jpeg
Я також підключився до 'stdout', щоб я міг запустити команду ImageMagick identify, щоб отримати інформацію про зображення на моєму хості, наприклад:
$ dockermagick identify MyImage.jpeg
MyImage.jpeg JPEG 640x426 640x426+0+0 8-bit DirectClass 78.6KB 0.000u 0:00.000
Існує очевидна небезпека щодо монтування поточного каталогу та дозволу передачі будь-якого довільного визначення команди для виконання. Але є також багато способів зробити сценарій більш безпечним / надійним. Я виконую це в моєму особистому невиробничому особистому оточенні, тому це не викликає у мене найбільшого занепокоєння. Але я настійно рекомендую вам взяти до уваги небезпеки, якщо ви вирішите розширити цей сценарій. Також варто зазначити, що цей сценарій не враховує хост OS X. Файл make, у якого я краду ідеї / концепції, це враховує, тому ви можете розширити цей сценарій для цього.
Іншим обмеженням, яке слід зазначити, є те, що я можу посилатися лише на файли, які зараз знаходяться в шляху, для якого я виконую сценарій. Це пов’язано з тим, як я монтую томи, тому наступне не буде працювати:
$ cd ~/MyImages
$ ls
MyImage.jpeg
$ dockermagick convert ~/DifferentDirectory/AnotherImage.jpeg Foo.png
$ ls
MyImage.jpeg
Найкраще просто перейти до каталогу, що містить зображення, і виконати безпосередньо проти нього. Звичайно, я впевнений, що є способи обійти це обмеження теж, але це стосується мене та моїх поточних потреб.
node
користувач створюється?