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

时间:2018-04-19 12:06:56

标签: php symfony 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

php图片的Dockerfile:

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服务器上?

我正在从用户$ docker-compose up运行myapp

UPD : 看起来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没有生效的原因。

这是一个原因。但它有什么美妙的解决方案呢?

3 个答案:

答案 0 :(得分:0)

容器内部和卷外部的用户ID在数字上是相同的(除非您的docker守护程序配置了用户名称空间),但可以轻松地使用不同的名称。如果要匹配主机上的用户,请使用数字ID。您应该也设置该组。

在Dockerfile构建中,RUN chown only 会影响进入图像的文件,在运行时使用绑定装载添加的文件。绑定装置还会在构建时隐藏容器映像内添加的文件。

如果卷所有者因系统而异,则在Dockerfile中引入build-arg。

ARG volumeOwnerGroup
USER $volumeOwnerGroup

使用以下内容进行构建:--build-arg volumeOwnerGroup=$(stat -c '%u:%g' /var/www/app)

在docker-compose文件中,您可以使用args字典设置build-args。您可以从与.env相同的目录中的docker-compose.yml文件中提取值。然后,您只需确保.env文件适合您的计算机。另请参阅https://vsupalov.com/docker-env-vars/

答案 1 :(得分:0)

尝试以下

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

答案 2 :(得分:0)

  

问题:当您使用docker-compose.yml卷中的内容时,它会覆盖Dockerfile上的卷,并且您将丢失所有更改   从该卷上的Dockerfile中获取。

     

解决方案::请将PHP卷的另一个路径(供应商)添加到您的docker-compose.yml文件中,如下所示:

- ./:/var/www/app
- /var/www/app/vendor