symfony docker缓存文件的权限问题

ivo*_*oba 5 symfony docker docker-compose

我有一个带有docker-compose的docker的symfony设置,除非我运行缓存时运行良好:从控制台清除,webserver无法访问文件.

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

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

docker exec -i -t apache_1 /bin/bash
Run Code Online (Sandbox Code Playgroud)

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

app/console cache:clear
Run Code Online (Sandbox Code Playgroud)

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

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

docker exec -u www-data -i -t apache_1 /bin/bash
Run Code Online (Sandbox Code Playgroud)

但这有一个缺点,我不会在bash,但在/ usr/sbin/nologin,并没有像bash_history等东西.

搜索我发现这是解决许可问题的Dockerfile的一部分,但它对我没有影响.

RUN usermod -u 1000 www-data
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,这将用户1000切换到www-data,但是当我登录到容器时我是根,这不起作用,我假设.

所以当我登录容器时为什么我会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"
Run Code Online (Sandbox Code Playgroud)

Max*_*ens 9

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

#change www-data`s UID inside a Dockerfile
RUN usermod -u [USERID] www-data 
Run Code Online (Sandbox Code Playgroud)

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

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

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

我想知道如何在容器构建时动态设置用户 ID。我想将它传递--build-arg给 docker-compose 将是方法

docker-compose build --build-arg USERID=$(id -u)
Run Code Online (Sandbox Code Playgroud)

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