symfony docker 缓存文件的权限问题

symfony docker permission problems for cache files

我为 docker 设置了一个带有 docker-compose 的 symfony 设置,它运行良好,除非我 运行 cache:clear 从控制台,网络服务器无法访问文件。

我可以通过在控制台中取消注释 umask(0000); 和 web/app_dev.php 来规避权限问题,但我想 运行 推荐的 symfony。

我所做的是启动容器 docker-compose up
然后我进入容器。该容器包含 apache、php 和通过数据卷的代码。

docker exec -i -t apache_1 /bin/bash

显然我当时以 root 身份登录 运行

app/console cache:clear

缓存中的所有文件都属于用户root。 www-data 作为网络服务器用户现在无法再访问这些文件。

我也可以通过以 www-data 身份登录来规避此问题,然后由 cache:clear 生成的文件属于 www-data 并且网络服务器可以访问它们。

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"

我认为将 www-datas userid 更改为主机用户的 id 是一个很好的解决方案,因为主机用户的权限设置起来相当容易。

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

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

然后您可以登录到容器以使用 www-data

运行 symfony 命令

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

我想知道如何在容器构建时动态设置用户标识。 我想通过 --build-arg 将其传递给 docker-compose 是

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

...但还没有设法访问 Dockerfile 中的那个 var。

添加到 Max 的

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

Docker 文件:

# 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) .