Introdução

Ao instalar temas e plugins no WordPress através do Docker, utilizando a imagem oficial do WordPress, você pode se deparar com um problema comum.

O WordPress não consegue descompactar temas e plugins na pasta wp-content dentro do contêiner.

Neste post, vamos explorar como corrigir esse problema ajustando o Dockerfile, o docker-compose.yml e outras configurações necessárias.

Dockerfile

Começando pelo Dockerfile, que utiliza a imagem oficial do WordPress com Apache e PHP 7.4, você pode realizar as seguintes configurações:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
FROM wordpress:php7.4-apache

ARG APACHE_RUN_PORT

RUN sed -i "s/80$/${APACHE_RUN_PORT}/" /etc/apache2/ports.conf \
    && sed -i "s/:80>$/:${APACHE_RUN_PORT}>/" /etc/apache2/sites-enabled/000-default.conf

RUN usermod -u 1000 www-data \
    && groupmod -g 1000 www-data

EXPOSE ${APACHE_RUN_PORT}

Na linha 3, você define o parâmetro APACHE_RUN_PORT para configurar a porta do Apache. Por padrão, no arquivo docker-compose.yml, a porta é definida como 8080.

Nas linhas 5 e 6, substituímos a porta padrão do Apache (80) pela porta 8080, conforme configurado no docker-compose.yml.

Nas linhas 8 e 9, alteramos os IDs do usuário e do grupo www-data para 1000. Isso resolve incompatibilidades com permissões de arquivos e pastas em sistemas Linux, que também afetam a instalação de temas/plugins no WordPress.

docker-compose.yml

No arquivo docker-compose.yml, definimos como será a execução do serviço WordPress:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
version: "3.9"
services:
  wordpress:
    build:
      context: .
      args:
        APACHE_RUN_PORT: "8080"
    network_mode: host
    volumes:
      - ./:/var/www/html
    user: www-data
    environment:
      APACHE_RUN_USER: "#1000"

Observe que o docker-compose.yml não tem conexão com um contêiner MySQL. Isso ocorre porque é comum executar o MySQL em um contêiner separado, especialmente quando você o utiliza para outros projetos.

Nesse cenário, você não precisa mapear portas no docker-compose.yml, pois a opção network_mode é configurada como “host”, permitindo que o contêiner WordPress veja todas as portas disponíveis no host.

Na linha 7, você pode alterar a porta 8080 para qualquer outra porta, caso ela já esteja sendo usada por outro serviço.

Na linha 13, definimos o ID do usuário padrão do Apache (www-data) como 1000, resolvendo o problema mencionado anteriormente no Dockerfile.

wp-config.php

Dentro da pasta do projeto WordPress, você deve definir a constante FS_METHOD como “direct” no arquivo wp-config.php:

1
2
/* Adicione valores personalizados entre esta linha até "Isto é tudo". */
define('FS_METHOD', 'direct');

Essa configuração instrui o WordPress a instalar temas/plugins usando operações diretas de E/S de arquivo, permitindo acesso direto ao sistema de arquivos.

Lembrando que essas configurações são úteis apenas em ambientes locais. Por questões de segurança, não é recomendado usar o método “direct” em ambientes de homologação ou produção.

No mesmo arquivo wp-config.php, para permitir que o WordPress se comunique com o serviço MySQL, altere a constante DB_HOST para 127.0.1.1:

1
2
/** Nome do host do MySQL */
define('DB_HOST', '127.0.1.1');

Resumo

Após criar os arquivos Dockerfile e docker-compose.yml e configurar o FS_METHOD e o DB_HOST no wp-config.php, você pode iniciar o contêiner do WordPress:

1
$ docker-compose up wordpress

Lembre-se de que o docker-compose.yml não inclui um contêiner MySQL. Portanto, é importante ter um contêiner MySQL em execução antes de iniciar o WordPress na máquina.

Em um ambiente local, é comum ter apenas um contêiner MySQL em execução para vários projetos. Para criar um contêiner MySQL separado, você pode executar o seguinte comando:

1
$ docker run --name mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql

Se preferir trabalhar com vários bancos de dados, adapte o arquivo docker-compose.yml para vincular a um contêiner MySQL separado. Para obter mais informações sobre como fazer isso, consulte a documentação oficial do Docker.