我有一个带有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"
答案 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) .