Written by: Helio Loureiro
Category: Linux
Hits: 7105

O herói de antigamente, quando eu comecei com Linux e BSD, era o sysadmin.  Um lobo solitário que cuidava de um ou mais servidores com vários scripts de automação.

Essa figura desapareceu e cedeu lugar à padronização e máquinas virtuais.  E as máquinas virtuais estão cada vez mais dando lugar aos containers.

Então a "arte" de fazer scripts está praticamente morrendo com poucos sysadmins ainda estudando perl, python, awk, etc.  Mas mesmo na criação de containers é possível colocar scripts em prática e de forma proveitosa.  Seriam o sysadmins 3.0.

Nesse sentido precisei criar um container pra rodar alguns programas em Java.  Criei o container baseado no Ubuntu 16.04, que é a versão que tenho no laptop de trabalho e com Maven e Java.  Maven é uma ferramenta de construção de Java parecida com pip no Python, CPAN no Perl, npm no node.js e rebar3 no Erlang.  Ele baixa as dependências nas versões desejadas e compila tudo pra gerar seu arquivo jar.  E também pode ser usado pra criar regras como de unittest.

Mas minha razão pra escrever esse post não é o Maven, que tem muitos outros artigos específicos muito bem escritos.  É sobre o Java.  Eu preciso rodar os meus programas com o JDK da Oracle.   E como automatizar?  Esse é o ponto dos scripts que comentei acima e razão desse artigo, de como usar ainda hoje em dia.  Como o download do JDK da Oracle exige aceitação dos termos de uso, é preciso fazer isso dentro do script (através de cookies).  O resto, é container puro.

O arquivo Dockerfile que criei é esse aqui:

FROM ubuntu:16latest

ENV container docker
ENV DEBIAN_FRONTEND noninteractive

RUN apt-get install -y \
        build-essential \
        lsb-release \
        tar \
        wget \
        unzip \
        sudo \
        git \
        curl \
        createrepo \
        java-package \
        fakeroot \
        maven

RUN apt-get install -y \
        libgtk-3-0 \
        libcairo-gobject2

RUN JAVA_URL=$(curl -sS http://www.oracle.com/technetwork/java/javase/downloads/index.html | \ 
                grep -i href | \
                grep "Download JDK" | \
                head -1 | \
                 tr " " "\n" | \
                grep href | \
                sed "s|.*href=\"\([^\"].*[^\"]\)\".*|\1|" ); \
        JDK_URL=$(curl -sS http://www.oracle.com$JAVA_URL | \
                grep -i "^downloads.*linux.*tar.gz.*" | \
                tr " ," "\n" | \
                grep http | \
                sed "s/.*\(http\)/\1/;s/\"//g" ); \
        curl \
                -SLkO \
                --header "Cookie: oraclelicense=accept-securebackup-cookie" \
                -# \
                $JDK_URL ; \
        linux_java=$(basename $JDK_URL) ; \
        version=$(echo $linux_java | sed "s/.*-\([0-9][^_]*\)_.*/\1/" | cut -d "." -f 1) ; \
        new_name=jdk-${version}-linux-x64.tar.gz ; \
        deb_name=oracle-java${version}-jdk_${version}_amd64.deb; \
        mv $linux_java /home/$new_name

# uid=2000(jenkins) gid=2000(jenkins) groups=2000(jenkins),999(ssh-allowed),130(libvirtd),131(kvm),998(docker)
RUN groupadd -g 2000 jenkins
RUN useradd -g 2000 -u 2000 -m jenkins

RUN su - jenkins -c "yes Y | fakeroot make-jpkg /home/jdk-*-linux-x64.tar.gz" 
RUN dpkg -i /home/jenkins/oracle-java*deb
RUN JAVA_HOME=$(update-java-alternatives -l | grep oracle | tail -1 | awk '{print $NF}') ; \
        JAVA_VERSION=$(update-java-alternatives -l | grep oracle | tail -1 | awk '{print $1}') ; \
        cd $JAVA_HOME; \
        ln -s jre .; \
        update-java-alternatives -s $JAVA_VERSION; \
        update-alternatives --install /usr/bin/java java $JAVA_HOME/bin/java 1; \
        update-alternatives --set java $JAVA_HOME/bin/java

Eu tenho um outro container chamado ubuntu:16latest que é um Ubuntu 16.04 com apt dist-upgrade pra ter a versão mais recente.  Eu geralmente adiciono o usuários jenkins pra poder rodar os containers dentro do jenkins. 

Uma vez feita a configuração, basta construir o container.  Como tenho vários arquivos pra fazer essas construções, eu geralmente salvo como Dockerfile.<distro>_<aplicativo>.  Nesse caso específico salvei num arquivo Dockerfile.ubuntu_java.  Para construir o container então:

docker build -t ubuntu:java -f Dockerfile.ubuntu_java . 

Feito o container e salvo com a tag ubuntu:java, basta somente chamar o container pra rodar seus programas em java ou compilar.

helio@linux:~/DockerBuilds$ docker run -it ubuntu:java java -version 
java version "10.0.1" 2018-04-17 
Java(TM) SE Runtime Environment 18.3 (build 10.0.1+10) 
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.1+10, mixed mode)

Daí pra frente é usar o Java como se estivesse instalado localmente.

Fontes:

1. https://wiki.debian.org/JavaPackage

2. https://www.debian.org/doc/manuals/debian-java-faq/ch5.html