我正在尝试在docker中部署symfony应用程序。现在我在 Linux 服务器上的权限方面遇到了问题。在我的本地Mac上一切正常。 我有docker-compose.yml
文件:
version: '3'
volumes:
. :
services:
db:
image: mysql
volumes:
- "./.data/db:/var/lib/mysql"
environment:
MYSQL_ROOT_PASSWORD: ${DATABASE_ROOT_PASS}
MYSQL_DATABASE: ${DATABASE_NAME}
MYSQL_USER: ${DATABASE_USER}
MYSQL_PASSWORD: ${DATABASE_PASS}
php:
build: ./docker/fpm
volumes:
- ./:/var/www/app
nginx:
build: ./docker/nginx
ports:
- ${APP_PORT}:8080
volumes:
- ./.logs/nginx/:/var/log/nginx
- ./:/var/www/app
和 Dockerfile 用于php
图像:
FROM php:7.1-fpm-alpine
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN composer --version
RUN chown -R www-data:www-data /var/www
USER www-data
WORKDIR /var/www/app
所以一切都很好,但是当我尝试运行docker-compose exec php composer install
后,我得到了错误:/var/www/app/vendor does not exist and could not be created.
为什么它只发生在 Linux 服务器上?
我正在从用户myapp
运行$ docker-compose up
.
上发:看起来chown
无法正常工作:
$ docker-compose exec php ls -l /var/www/app
:
total 168
-rw-r--r-- 1 40007 40007 1662 Apr 19 08:44 Makefile
...
所有者不www-data
UPD2: 我认为原因是在我们从 docker-compose 文件中挂载volume
后,它会从该卷中获取规则,所以这就是chown
没有效果的原因。
这是一个原因。但是,这是多么美丽的解决方案呢?
容器内和卷外的用户 ID 在数值上是相同的(除非您的 docker 守护程序配置了用户命名空间),但很容易有不同的名称。如果要匹配主机上的用户,请使用数字 ID。您还应该设置该组。
在 Dockerfile 构建中,RUN chown仅影响进入映像的文件,而不会影响在运行时使用绑定挂载添加的文件。绑定装载还将隐藏在生成时添加到容器映像中的文件。
如果卷所有者因系统而异,请在 Dockerfile 中引入构建参数。
ARG volumeOwnerGroup
USER $volumeOwnerGroup
使用:--build-arg volumeOwnerGroup=$(stat -c '%u:%g' /var/www/app)
构建
在 docker-compose 文件中,您可以使用args
字典设置 build-args。您可以从与docker-compose.yml
相同的目录中的.env
文件中为其提取值。然后,您只需确保.env
文件适合您的机器。另请参阅 https://vsupalov.com/docker-env-vars/。
尝试以下操作
FROM php:7.1-fpm-alpine
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN composer --version
RUN mkdir -p /var/www/app
&& chown -R www-data:www-data /var/www
USER www-data
WORKDIR /var/www/app