无法在 docker 容器内创建目录.权限问题



我正在尝试在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

最新更新