Criar um container Docker + Python e adicionar a ele o Oracle client pode ser um verdadeiro parto. Nesse artigo, veremos como Containizar uma aplicação Python + Django 2 que usa uma base de dados Oracle.
IMPORTANTE: Nesse artigo assumo que você já tem uma aplicação em Django pronta e já rodando, todos os comandos e arquivos que se seguirão deverão estar dentro da mesma pasta de sua aplicação.
PASSO 1. No seu projeto Python + Django, crie um arquivo chamado Dockerfile (isso mesmo, sem extensão, sem nada). No arquivo, digite o seguinte:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
FROM python:3 ENV PYTHONHONUNBUFFERED 1 RUN mkdir /code WORKDIR /code COPY . /code/ RUN pip install -r requirements.txt ENV ORACLE_HOME= /usr/lib/oracle/12 .1 /client64 ENV PATH=$PATH:$ORACLE_HOME /bin ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME /lib ADD oracle-instantclient12.1-basic-12.1.0.2.0-1.x86_64.rpm /tmp/ ADD oracle-instantclient12.1-sqlplus-12.1.0.2.0-1.x86_64.rpm /tmp/ ADD oracle-instantclient12.1-devel-12.1.0.2.0-1.x86_64.rpm /tmp/ # Setup locale, Oracle instant client and Python RUN apt-get update \ && apt-get -y install alien libaio1 \ && alien -i /tmp/oracle-instantclient12 .1-basic-12.1.0.2.0-1.x86_64.rpm \ && alien -i /tmp/oracle-instantclient12 .1-sqlplus-12.1.0.2.0-1.x86_64.rpm \ && alien -i /tmp/oracle-instantclient12 .1-devel-12.1.0.2.0-1.x86_64.rpm \ && ln -snf /usr/lib/oracle/12 .1 /client64 /opt/oracle \ && mkdir -p /opt/oracle/network \ && ln -snf /etc/oracle /opt/oracle/network/admin \ && pip install cx_oracle \ && apt-get clean && rm -rf /var/cache/apt/ * /var/lib/apt/lists/ * /tmp/ * /var/tmp/ * ADD root / |
Observação
O arquivo Dockerfile deve estar na mesma pasta do seu projeto Django.
Esse arquivo será o responsável por criar um container no Docker baseado na imagem oficial do Python (FROM python:3). Ele criará o ambiente e instalará as dependências do projeto (as dependências deverão estar num arquivo chamado requirements.txt).
PASSO 2 (SÓ SE VOCÊ AINDA NÃO TEM UM ARQUIVO requirements.txt). Crie um arquivo requirements.txt e coloque nele o seguinte:
1
2
3
4
|
Django==2.0.5 djangorestframework==3.8.2 pytz==2018.4 cx-Oracle==6.1 |
PASSO 3. Após isso, crie um arquivo chamado docker-compose.yml. Esse arquivo será executado, por assim dizer, toda vez que um container for executado, criando assim nosso “ambiente virtual”. Coloque o seguinte nesse arquivo:
1
2
3
4
5
6
7
8
9
10
|
version: '3' services: web: build: . command: python manage.py runserver 0 .0.0.0: 8000 volumes: - . : /code ports: - "8000:8000" |
Como você pode ver, esse é o arquivo responsável por executar um serviço chamado web (poderia ser qualquer outro nome). Esse serviço, ao ser executado, rodará o comando python manage.py runserver 0.0.0.0:8000, o qual será o responsável por podermos executar nossa aplicação na web.
PASSO 4. Baixe do site da oracle e mova os arquivos listados abaixo para a mesma pasta onde encontra-se os arquivos do projeto Django:
- http://download.oracle.com/otn/linux/instantclient/121020/oracle-instantclient12.1-basic-12.1.0.2.0-1.x86_64.rpm
- http://download.oracle.com/otn/linux/instantclient/121020/oracle-instantclient12.1-sqlplus-12.1.0.2.0-1.x86_64.rpm
- http://download.oracle.com/otn/linux/instantclient/121020/oracle-instantclient12.1-devel-12.1.0.2.0-1.x86_64.rpm
VOCÊ PODE ENCONTRAR OS MESMOS ARQUIVOS EM MEU REPOSITÓRIO NO GITHUB: https://github.com/WilliamZimmermann/docker-oracleclient.git
Como você talvez já tenha percebido, esses arquivos são os arquivos rpm referenciados no Dockerfile, PASSO 1.
PASSO 5. Agora é necessário criar uma ligação entre o Oracle Instant Client instalado em sua máquina virtual Docker e a base de dados Oracle que será usada. Crie uma pasta no mesmo diretório do seu projeto Django chamada root/etc/oracle. Dentro dela, coloque os arquivos SQLNET.ora e tsnames.ora (são arquivos que mapeiam as conexões com as bases de dados da sua rede, por exemplo):
Você pode baixar um exemplo no meu diretório no GitHub: https://github.com/WilliamZimmermann/docker-oracleclient/tree/master/root/etc/oracle
Até aí, o diretório do seu projeto deverá parecer com o seguinte:
Hora de construir e rodar
PASSO 6. Com tudo salvo, faça o build do container/imagem:
docker-compose build |
PASSO 7. Depois de vários minutos (o processo de build pode demorar bastante, uma vez que ele baixa a imagem do SO e dependências), é hora de subirmos nossa imagem para que possamos usá-la. Digite o seguinte comando no terminal:
docker-compose up -d |
PASSO 8. Para ver os serviços rodando e ver em que endereço você pode acessar no navegador, digite:
docker-compose ps |
Uma lista de serviços como a abaixo será exibida:
Observe que, no meu caso, está rodando um serviço chamado rhconnect_web_1 que roda aquele comando do Django… python manage.py runserver… Bem, esse comando está ativo (State UP) e eu posso acessar minha aplicação através do endereço: 0.0.0.0:8000 (ou localhost:8000).
É isso aí, espero ter ajudado…. Essa é a primeira vez que eu crio um container, etc, no Docker. Sempre usei de outros mas nunca havia criado antes. Por isso, peço perdão se houver alguma nomenclatura errada. Se você tiver alguma sugestão ou correção sobre o que eu disse, por favor, fique a vontade para me auxiliar nos comentários, apreciaria muito.