Normalmente uma imagem docker S2I já possui todos os componentes básicos para desenvolver a maioria das aplicações, mas sempre tem aquele colega de trabalho que usa uma lib obscura para fazer aquela gambiarra nossa de cada dia.
Pra não deixar essa galera sem a nossa ferramenta de build preferida, vou mostrar como é fácil, rápido e barato customizar um image builder S2I.
Você vai precisar de:
Código fonte do image build S2i — vou usar php porque é a linguagem mais popular do universo
O nome do pacote, ou binário, ou coisa que pretende instalar na imagem
Vamos começar fazendo o setup. Baixe o código fonte para gerar a imagem que você escolheu. Na Getup Cloud utilizamos basicamente as imagens oficiais do projeto Software Collections, disponíveis no Github do projeto. No entanto, temos nossa própria imagem S2I para PHP 7, e é essa que vamos utilizar neste tutorial.
$ git clone https://github.com/getupcloud/sti-php.git
$ cd sti-php
O Dockerfile da versão 7.0 deve ser algo parecido com o gist abaixo:
https://gist.github.com/caruccio/9af565bdf6e3f9721ca62893b2a3f098
Vamos fazer um primeiro build:
$ cd 7.0
$ docker build . -t custom-php7
Incluindo novos pacotes
Vamos simplesmente extender esta imagem e adicionar nossos pacotes. Para isso vamos primeiro descobrir o nome:tag da imagem utilizada aqui na Getup:
$ oc describe imagestream/php -n openshift
Name: php
Namespace: openshift
Created: 11 months ago
Labels: <none>
Annotations: openshift.io/image.dockerRepositoryCheck=2016-10-27T20:30:04Z
Docker Pull Spec: 172.30.34.145:5000/openshift/php
Unique Images: 28
Tags: 4
7.0
tagged from getupcloud/php-70-centos7:latest
...
Agora podemos criar nosso Dockerfile em outro diretório:
$ mkdir custom-php7
$ cd custom-php7
$ cat Dockerfile
# Usando a imagem oficial da getup como base
FROM getupcloud/php-70-centos7:latest
# Precisamos trocar para root antes de instalar algo
USER root
# Instalamos nossa dependencia
RUN yum install -y --enablerepo=remi-php70 php-devel && \
yum clean all -y && \
pecl install zip && \
pecl clear-cache && \
echo "extension=zip.so" >> /etc/php.ini
# E voltamos para o usuario padrao
USER 1001
Construir nossa imagem customizada (custom-php7) requer um build:
$ docker build -t custom-php7 .
Para verificar que a lib zip foi realmente instalado você pode criar um container e verificar a saída do pecl list:
$ docker run -it --rm custom-php7 bash
bash-4.2# pecl list | grep zip
zip 1.13.5 stable
bash-4.2# exit
Para testar podemos usar o comando s2i e construir nossa aplicação localmente antes de enviar para o DockerHub (saiba mais sobre s2i no artigo Docker — do código a imagem com S2I)
$ cat index.php
<?php phpinfo(); ?>
$ s2i build --copy . custom-php7 custom-app
$ docker run -it --rm -p 8080:8080 custom-app
Acesse o container no seu browser em http://127.0.0.1:8080 e procure por "Zip version".
Publicar na Getup
Agora que temos nosso ImageBuilder customizado para php7, usado pelo s2i para buildar imagens de aplicação, podemos enviá-lo para o DockerHub. A partir de lá que a plataforma Getup busca as imagens para executar.
Para isso você vai precisar de uma conta no DockerHub. Vá lá, faça seu cadastro e volte aqui…
Agora faça login com seu cliente docker e crie uma tag do último build:
$ docker login
$ docker tag custom-php7 ${DOCKERHUB_LOGIN}/custom-php7:latest
$ docker push ${DOCKERHUB_LOGIN}/custom-php7:latest
Substitua ${DOCKERHUB_LOGIN} pelo seu login do DockerHub
Pro tip: Você pode fazer o build e tagear ao mesmo tempo: docker build -t ${DOCKERHUB_LOGIN}/custom-php7:latest .
Como último passo vamos criar um ImageStream que utilize esta imagem docker em sua conta na Getup.
O ImageStream é uma configuração que agrupa e trackeia imagens docker. Ele é um objeto padrão do OpenShift e permite disparar builds automaticamente para suas aplicações quando uma imagem docker trackeada é atualizada e re-importado na plataforma.
$ cat custom-php7-imagestream.yaml
apiVersion: v1
kind: ImageStream
metadata:
name: custom-php7
spec:
tags:
- name: "7.0"
annotations:
description: My Custom PHP-7 ImageBuilder
iconClass: icon-php
sampleRepo: https://github.com/openshift/cakephp-ex.git
supports: php:7.0,php
tags: builder,php
version: "7.0"
from:
kind: DockerImage
name: ${DOCKERHUB_LOGIN}/custom-php7:latest
- name: latest
annotations:
description: My Custom PHP-7 ImageBuilder
iconClass: icon-php
sampleRepo: https://github.com/openshift/cakephp-ex.git
supports: php:7.0,php
tags: builder,php
version: "latest"
from:
kind: ImageStreamTag
name: "7.0"
A partir deste ponto você vai precisar do comando oc
— https://ajuda.getupcloud.com/hc/pt-br/articles/221403968
Vamos criar nosso ImageStream dentro de nosso projet0:
$ oc create -f custom-php7-imagestream.yaml
Note que você deve substituir o valor de ${DOCKERHUB_LOGIN} no arquivo acima
O passo final é disparar a importação desta imagem para dentro da plataforma OpenShift da Getup:
$ oc import-image custom-php7
Pronto! A partir de agora você pode construir sua app PHP7 a partir de seu ImageBuilder PHP customizado. Acesse https://portal.getupcloud.com e crie uma nova aplicação.
Dicas
Caso você necessite alterar algo na imagem builder (adicionar, editar ou remover uma camada docker) será necessário:
Recriar a image localmente (docker build…)
Mover a tag (docket tag…)
Enviar ao dockerhub (docker push…)
Importa na Getup (oc import-image…)
Para alterar o ImageStream (custom-php7-imagestream.yaml) voce só precisar editar o arquivo localmente e usar o comando oc replace custom-php7-imagestream.yaml.
Se a alteração envolver a imagem docker (mudar a tag, repositório, nome, etc) será necessário re-importar ela na plataforma (ver passo 4 acima).
[embed]https://upscri.be/375ca4/[/embed]