symfony docker缓存文件的权限问题

时间:2016-01-22 14:30:35

标签: symfony docker docker-compose

我有一个带有docker-compose的docker的symfony设置,除非我从控制台运行 cache:clear ,否则web服务器无法访问这些文件。

我可以通过在控制台和web / app_dev.php中取消注释 umask(0000); 来绕过权限问题,但我想按照建议运行symfony。

我做的是旋转容器docker-compose up
然后我进入容器。容器包含apache,php和通过数据卷的代码。

docker exec -i -t apache_1 /bin/bash

显然我以root身份登录然后运行

app/console cache:clear

缓存中的所有文件都属于root用户。 www-data as webserver用户现在无法再访问文件了。

我也可以通过以www-data登录然后缓存生成的文件来避免这种情况:clear属于www-data,webserver可以访问它们。

docker exec -u www-data -i -t apache_1 /bin/bash

但是这有一个缺点,我不会在bash中登陆但是在 / usr / sbin / nologin 中并且没有bash_history等等。

搜索我发现这是解决权限问题的Dockerfile的一部分,但它对我没有任何影响。

RUN usermod -u 1000 www-data

如果我理解正确,这会将用户1000切换为www-data,但是当我登录容器时我是root用户,这不起作用,我认为。

为什么我登录容器时 root usermod 如何工作?

docker-compose.yml:

proxy:
  image: jwilder/nginx-proxy:latest
  volumes:
    - /var/run/docker.sock:/tmp/docker.sock:ro
  ports:
    - "80:80"
elastic:
  build: docker/elasticsearch
  ports:
    - "9200:9200"
  volumes:
    - data/elasticsearch:/usr/local/elasticsearch/data
apache:
  build: docker/apachephp
  environment:
    - VIRTUAL_HOST=myapp.dev
  volumes:
    - ./code:/var/www/app
    - ./dotfiles/.bash_history:/.bash_history
    - ./logs:/var/www/app/app/logs
  links:
    - elastic
  expose:
    - "80"

2 个答案:

答案 0 :(得分:4)

我认为将www-data的用户ID更改为主机用户的ID是一个很好的解决方案,因为主机用户的权限很容易设置。

#change www-data`s UID inside a Dockerfile
RUN usermod -u [USERID] www-data 

用户ID 1000是大多数Linux系统的默认值...在mac上的501 您可以在主机系统上运行id -u以查找。

然后,您可以登录容器以运行symfony命令作为www-data

docker exec -it -u www-data [CONTAINER] bash

我想知道如何在容器构建上动态设置userid。 我想通过--build-arg将它传递给docker-compose将是

的方式
docker-compose build --build-arg USERID=$(id -u)

...但尚未设法访问Dockerfile中的var。

答案 1 :(得分:1)

添加到Max的answer

请注意,这些想法也可以用于非Symfony应用程序。

Dockerfile:

# 1000 is default, in case --build-arg is not passed with the build command.
ARG USER_ID=1000
ARG GROUP_ID=1000
ARG HOME_DIR=/home/www-data
# Change user ID & group ID & home directory & shell of www-data user.
# We change home dir because some custom commands may use home dir
# for caching (like composer, npm or yarn) or for another reason.
RUN mkdir ${HOME_DIR} \
    && chown -R ${USER_ID}:${GROUP_ID} ${HOME_DIR} \
    && usermod --uid ${USER_ID} --home ${HOME_DIR} --shell /bin/bash www-data \
    && groupmod --gid ${GROUP_ID} www-data

如果要在Dockerfile / ENTRYPOINT / CMD等中以www-data用户身份运行命令,则可以使用su,如下所示:

su - www-data -c "cd /var/www/html && composer install && npm install && node_modules/.bin/encore dev --watch &"

构建命令:

# $(id -u) gets the current user's ID and $(id -g) gets the current user's group ID.
# If you want to use another ID go ahead and replace them.
docker-compose build --build-arg USER_ID=$(id -u) --build-arg GROUP_ID=$(id -g)
# or
docker build --build-arg USER_ID=$(id -u) --build-arg GROUP_ID=$(id -g) .