1
resposta

Host e container com permissões diferentes

Olá, tenho uma aplicação Vuejs/Laravel que quero que rode pelo docker. Criei o Dockerfile do php e também o docker-compose e tudo funciona normalmente na construção das images e containers. No entando, tenho alguns problemas de permissão, pois meu container não consegue escrever no arquivo de logs da aplicação e eu não consigo editar/excluir arquivos e pastas geradas pelos containers. Pelo que entendi, minha máquina e os containers estão compartilhando os mesmos volumes mas não as mesmas permissões.

Mensagem de erro da aplicação rodando em um container do php.

UnexpectedValueException
The stream or file "/var/www/html/storage/logs/laravel.log" could not be opened in append mode: failed to open stream: Permission denied 

Mensagem de erro caso eu tente por exemplo excluir a pasta node_modules criada pelo container do yarn (rm -rf node_modules).

...
rm: cannot remove 'node_modules/cssnano-preset-default/node_modules/postcss/lib/result.js': Permission denied
...

docker-compose.yml

version: '3'

services:
  nginx:
    image: nginx:stable-alpine
    container_name: nginx
    ports:
      - 8088:80
    volumes:
      - ./src:/var/www/html
      - ./server/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php
      - mysql
    networks:
      - laravel_vue_template

  mysql:
    image: mysql:5.7.22
    container_name: mysql
    restart: unless-stopped
    tty: true
    ports:
      - 4306:3306
    volumes:
      - ./database:/var/lib/mysql
    environment:
      DB_DATABASE: laravel
      DB_USERNAME: root
      DB_PASSWORD: secret
    networks:
      - laravel_vue_template

  php:
    build:
      context: ./docker/php
      dockerfile: Dockerfile
    container_name: php
    volumes:
      - ./src:/var/www/html
    ports:
      - 9000:9000
    networks:
      - laravel_vue_template

  composer:
    image: composer:latest
    container_name: composer
    working_dir: /var/www/html
    volumes:
      - ./src:/var/www/html
    networks:
      - laravel_vue_template

  artisan:
    build:
      context: ./docker/php
      dockerfile: Dockerfile
    container_name: artisan
    entrypoint: ['/var/www/html/artisan']
    working_dir: /var/www/html
    volumes:
      - ./src:/var/www/html
    depends_on:
      - mysql
    networks:
      - laravel_vue_template

  yarn:
    image: node:14.15
    container_name: yarn
    entrypoint: ['yarn']
    working_dir: /var/www/html
    volumes:
      - ./src:/var/www/html
    networks:
      - laravel_vue_template

networks:
  laravel_vue_template:

docker/php/Dockerfile (Dockerfile do PHP)

FROM php:7.4-fpm-alpine

RUN docker-php-ext-install pdo pdo_mysql

server/default.conf (Configuração do NGINX)

server {
  listen 80;
  index index.php index.html;
  server_name localhost;
  error_log /var/log/nginx/error.log;
  access_log /var/log/nginx/access.log;
  root /var/www/html/public;

  location / {
    try_files $uri $uri/ /index.php?$query_string;
  }

  location ~ \.php {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass php:9000;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
  }
}

Gostaria que os containers e meu usuário sempre compartilhassem as mesmas permissões a todos os arquivos e pastas do projeto independente de quem é o dono do arquivo/pasta.

1 resposta

Olá, Matheus. Tudo bem?

Fica um pouco complicado sem ter a aplicação para poder testar. Se puder compartilhar o código, facilita.

Caso não possa, você já tentou alterar a permissão do diretório que precisa ser modificado para deixar o mais permissível possível? Se você usa o volume do tipo bind-mounted, que é esse quando usarmos o caminho do arquivo explicitamente ./src:/var/www/html, caso a permissão tenha sido definida para escrita somente para o seu usuário/grupo, não será possível modificar através dos containers, já que eles não agem como seu usuário.

Você pode definir que todos tenham permissões para todas as operações nos diretórios que você quer usar como volume para fazer o teste, rodando chmod -R 777 [diretório].

Testa aí e diz o resultado?

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software