2016-03-23 3 views
0

Я пишу файл Docker, где пользователь root создает пользователя с именем blog для управления развертыванием веб-сайта. Я использую контейнер Docker Hub wordpress в качестве базы. Пользователь root создает папки под номером /var/www/html и предоставляет пользователям права на запись blog.Как можно повлиять на порядок команд RUN в файле Docker?

В следующем наборе команд RUN, следующих за USER blog, эти команды не подтверждают предыдущее состояние, в котором blog пользователю было разрешено писать в /var/www/html. Этот пользователь должен клонировать git repo там, но я получаю ошибку fatal: could not create leading directories of '/var/www/html/wp-content/uploads': Permission denied из-за того, что новый пользователь не может там писать, несмотря на то, что ранее устанавливал разрешения для этого пользователя.

Вот команды, я использую для создания blog пользователя, копировать файлы в свой домашний каталог, а затем клонировать репозиторий с этим пользователем:

ENV WORDPRESS_DB_USER=wp_blog \ 
WORDPRESS_DB_NAME=wp_blog \ 
WORDPRESS_DIR=/var/www/html \ 
TERM=xterm 

# Setup the WordPress site user 
# Preliminary command 
RUN useradd --create-home --shell /bin/false --groups www-data blog  

COPY id_rsa* known_hosts /home/blog/.ssh/ 
## First set of commands 
RUN mkdir --parents "$WORDPRESS_DIR"/wp-content/uploads \ 
&& chown --recursive blog:blog "$WORDPRESS_DIR" \ 
&& chown --recursive blog:blog /home/blog 

USER blog 
## Second set of commands 
RUN chmod u=rw,g=,o= /home/blog/.ssh/id_rsa \ 
&& chmod u=rw,g=r,o=r /home/blog/.ssh/id_rsa.pub \ 
&& chmod u=rw,g=r,o=r /home/blog/.ssh/known_hosts \ 
&& eval $(ssh-agent -s) \ 
&& ssh-add \ 
&& export PATH=$PATH:/usr/sbin \ 

# Use the WordPress user to download the content repo and hooks 
# The following command results in a permissions error: 
&& git clone [email protected]:jb-merideoux/jbm-uploads.git "$WORDPRESS_DIR"/wp-content/uploads \ 
&& mkdir --parents /home/blog/git/wpgithooks \ 
&& cd /home/blog/git/wpgithooks \ 
&& git clone [email protected]:enderandpeter/wpgithooks.git /home/blog/git/wpgithooks \ 
&& git checkout --git-dir=/home/blog/git/wpgithooks/.git --track origin/wpaddons \ 
&& chmod u+x /home/blog/git/wpgithooks/*.sh \ 
&& echo Run the script at /home/blog/git/wpgithooks/setup.sh to get started 

blog пользователь имеет возможность установить разрешения скопированная пара ключей SSH, но она не может, если команда chown --recursive blog:blog /home/blog отсутствует. Я бы подумал, что предыдущая команда chown --recursive blog:blog "$WORDPRESS_DIR" будет иметь равное влияние на то, может ли пользователь писать в /var/www/html в том же наборе команд, где blog изменяет разрешения для файлов, скопированных в его дом, на root после того, как пользователь root удостоверился, что все, /home/blog был в собственности blog. Так или иначе, разрешения для /home/blog действуют во втором наборе команд RUN, но не разрешений для /var/www/html.

При ближайшем рассмотрении, казалось бы, что mkdir --parents "$WORDPRESS_DIR"/wp-content/uploads инструкция не работает либо потому, что, когда я перед командой git clone с чем-то, чтобы создать файл как touch "$WORDPRESS_DIR"/wp-content/uploads/afile, ошибка touch: cannot touch '/var/www/html/wp-content/uploads/afile': No such file or directory.

Когда я пытаюсь создать afile в /var/www/html/ (который уже существует, потому что он был создан базовый контейнер WordPress), я получаю ошибку touch: cannot touch '/var/www/html/afile': Permission denied, указывая на то, что команда chown --recursive blog:blog "$WORDPRESS_DIR" не была признана. Из трех команд в первом наборе операторов RUN, похоже, что только один, подтвержденный вторым набором операторов RUN, равен chown --recursive blog:blog /home/blog.

Как я могу записать этот файл Docker так, чтобы все команды в первом заявлении RUN были выпущены к тому моменту, когда новый набор операторов RUN был выполнен новым пользователем?

+0

Посмотрите эту ссылку. Вероятно, это не проблема разрешения, но проблема ssh-ключа http://www.docunext.com/blog/2011/02/fatal-could-not-create-leading-directories-of-permission-denied.html –

+0

Спасибо за совет! Я взгляну. Я нашел еще один вопрос StackOverflow, который я не нашел прямо сейчас, и это тоже показалось. Я редактировал свой вопрос с некоторыми наблюдениями, которые убеждают меня, что только один из первых наборов команд был выполнен, когда выдается второй набор команд. –

ответ

0

Ничего себе, это было интенсивным. Второй набор команд просто никогда не поднимает того, что было сделано заранее. Я видел примеры, когда последующие команды RUN знают о событиях, которые произошли в предыдущих, поэтому я все еще не понимаю, насколько это определено.

Решение, которое я нашел в том, чтобы использовать su в первом наборе команд, сразу после корня создает каталоги и устанавливает права доступа:

RUN mkdir --parents "$WORDPRESS_DIR"/wp-content/uploads \ 
    && chown --recursive blog:blog "$WORDPRESS_DIR" \ 
    && chown --recursive blog:blog /home/blog \ 
    && su - blog -s /bin/bash -c '\ 
     chmod u=rwx,g=,o= /home/blog/.ssh \ 
     && chmod u=rw,g=,o= /home/blog/.ssh/id_rsa \ 
... 
    && git clone [email protected]:jb-merideoux/jbm-uploads.git '"$WORDPRESS_DIR"'/wp-content/uploads \ 
... 
    && echo '"$WORDPRES_DIR"' setup complete.' 

Как вы можете видеть, что является некоторыми безумными процитировать, но, к счастью, вы можете форматируйте команды точно так, как если бы они были переданы прямо в файл Docker. Я использовал USER blog в самом конце, чтобы делать то, что не зависело от более ранних вещей, но иногда я думаю, что с Docker вам нужно собрать целую кучу команд вместе, но я могу, вероятно, получить все это в отдельный скрипт ...

Смежные вопросы