Я пишу файл 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 был выполнен новым пользователем?
Посмотрите эту ссылку. Вероятно, это не проблема разрешения, но проблема ssh-ключа http://www.docunext.com/blog/2011/02/fatal-could-not-create-leading-directories-of-permission-denied.html –
Спасибо за совет! Я взгляну. Я нашел еще один вопрос StackOverflow, который я не нашел прямо сейчас, и это тоже показалось. Я редактировал свой вопрос с некоторыми наблюдениями, которые убеждают меня, что только один из первых наборов команд был выполнен, когда выдается второй набор команд. –