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-data
s 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) .
我为 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-data
s 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) .