Rodando o PHP 7 via Docker

Dica para quem está utilizando Linux com Docker, e não possui PHP 7 configurado na sua máquina.

No meu caso específico, quero apenas rodar alguns testes do PHPUnit em um projeto que clonei do Github, mas não possuo o PHP 7 instalado aqui no meu Debian 8.

Criei um novo arquivo chamado /usr/local/bin/php7 contendo o conteúdo a seguir:

docker run -u `stat -c "%u:%g" .` -ti --rm -v $(pwd):/workspace php sh -c "cd /workspace; php $*"

Marquei esse arquivo com o bit de execução:

chmod a+x /usr/local/bin/php7

O que esse comando acima faz é criar um novo comando php7 no seu terminal.

Eu utilizei o comando da seguinte forma dentro do meu projeto:

php7 vendor/bin/phpunit

E funcionou muito bem!

Screenshot from 2017-11-19 10-19-16

Explicação passo a passo do comando

1) O comando principal é um docker run, ou seja, estamos criando um novo container do Docker.

2) O parâmetro -u `stat -c “%u:%g” .` faz com que o container seja executado com o mesmo usuário e grupo do Linux que o usuário que está chamando o comando. Isso evita que qualquer output gerado pelo container seja criado como usuário root na máquina host.

3) Os parâmetros -t -i (que estão juntos como -ti no comando acima) aloca um pseudo-TTY interativo, isto é, a entrada (stdin) e a saída (stdout) do seu terminal vão ficar acoplados à entrada e saída do container do Docker. Isto permite, entre outras coisas, cancelar um comando em execução dentro do container apertando as teclas CTRL+C, o que não seria possível se omitíssemos os parâmetros -ti.

4) O parâmetro –rm faz com que o container seja automaticamente excluído após sua execução, liberando algumas dezenas de megabytes do seu HD. Como o nosso container é provisório, e será criado novamente a cada novo comando php7, devemos nos atentar em utilizar esse parâmetro –rm.

5) O parâmetro -v $(pwd):/workspace faz com que a pasta atual onde você executou o comando php7 seja montada no diretório /workspace dentro do container. Isso é importante para o interpretador php de dentro do container ter acesso aos arquivos que você está tentando executar.

6) O argumento php indica que queremos criar um container com a imagem chamada php. Se você não tiver essa imagem no seu host, ela baixará automaticamente a última versão (docker pull implícito) a partir do Docker Hub. No meu caso, ele baixou automaticamente a imagem php 7.1.11:

Screenshot from 2017-11-19 10-23-22

7) Para finalizar, os argumentos sh -c “cd /workspace; php $*” indicam qual comando desejamos rodar dentro do container do PHP 7. Nesse caso, estamos chamando o comando sh, que por sua vez executa os comandos cd /workspace; php $*. Ou seja, primeiro mudamos para o diretório /workspace (lembra que fizemos um mount do diretório atual dentro dessa pasta no container? Releia o passo 5 para entender melhor), e depois executamos o comando php juntamente com qualquer argumento que seja passado para o script php7 (é isso que a parte $* faz, simplesmente copia os argumentos de um script para um outro).

Portanto, quando eu rodo o comando php7 –version, o argumento –version é passado para dentro do comando do container, como se eu tivesse digitado sh -c “cd /worksapce; php –version”.

Pronto, a mágica é essa. Em caso de dúvidas ou sugestões de correção nas explicações acima, por favor contribua com o seu comentário!

Até a próxima,
Rafael

Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>