Pesquisar aqui

Mostrar mensagens com a etiqueta bash. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta bash. Mostrar todas as mensagens

segunda-feira, 16 de novembro de 2020

[IDS] Docker: Dockerfile, imagem, distribuição, container e registry

Dockerfile reference

Docker can build images automatically by reading the instructions from a Dockerfile. A Dockerfile is a text document that contains all the commands a user could call on the command line to assemble an image. Using docker build users can create an automated build that executes several command-line instructions in succession.

USAGE

The docker build command builds an image from a Dockerfile and a context. The build’s context is the set of files at a specified location PATH or URL. The PATH is a directory on your local filesystem. The URL is a Git repository location.

A context is processed recursively. So, a PATH includes any subdirectories and the URL includes the repository and its submodules. This example shows a build command that uses the current directory as context:

docker build --tag nomedaimagem:tag .

No directório com o trabalho apresentado em "[IDS] Estrutura do ambiente de desenvolvimento: rplotter", é criado o Dockerfile com o editor VIM:

vim Dockerfile

FROM alpine:3.7
MAINTAINER Guilherme Marcello
LABEL description="Imagem com os exemplos dos artigos do Blogger"
WORKDIR aib/
WORKDIR blogger/
COPY . . 

Para gravar o ficheiro :x

home@marcello:~$ ls
development Dockerfile

Fazemos a build da imagem com o nome aib2021marcello/blogger e a tag rplotter:

home@marcello:~$ docker build --tag aib2021marcello/blogger:rplotter .
...
...
Successfully built 80d3e5712bee
Successfully tagged aib2021marcello/blogger:rplotter

Perfeito! A nossa imagem foi criada e tem o id 80d3e5712bee! Para verificar as imagens que existem localmente usamos o seguinte comando:
 
home@marcello:~$ docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
aib2021marcello/blogger   rplotter            80d3e5712bee        0 minutes ago      4.21MB
alpine                    3.7                 6d1ef012b567        20 months ago       4.21MB

Sim, criamos uma "distribuição" do alpine linux personalizada com um tamanho de 4.21MB para os projectos no blogger de AIB!
Para corrermos a "distribuição" em container com o nome primeirocontainer e de forma interativa (iniciamos uma sessão em shell do container) usamos o comando:
 
home@marcello:~$ docker run --name primeirocontainer -it aib2021marcello/blogger:rplotter
/aib/blogger$ ls
Dockerfile   development
/aib/blogger$ exit
home@marcello:~$

 O que isso significa? QUALQUER pessoa com a imagem que fizemos vai ter o mesmo sistema a correr!
 E então...? QUALQUER pessoa com a imagem vai ter o mesmo ambiente, com as mesmas definições!
 Sim...e? QUALQUER pessoa com a imagem vai correr os projectos da MESMA forma!

 Problemas do tipo "preciso da versão X do java para compilar e fazer a build do projecto da empresa YYY...que chatice!" deixam de existir e assim temos maior agilidade no desenvolvimento, debug e deploy! 

 Mas tenho a minha imagem gravada localmente, como alguém pode descarregar a minha imagem e correr um container? Fazemos um push para um registry no Docker Hub, por exemplo. No Docker Hub criei uma conta com o username aib2021marcello e criei um repositório público (qualquer pessoa com docker pode fazer pull da minha imagem) com o nome blogger (sim, o mesmo nome da imagem que fizemos, aib2021marcello/blogger). Assim, podemos fazer o push da nossa imagem para o Docker Hub! 
    1. Primeiro é preciso fazer o login (autenticação) com a nossa conta do Docker Hub (com as mesmas credenciais):

home@marcello:~$ docker login
...
...
Login Succeeded

    2. Depois fazemos o push da nossa imagem:

home@marcello:~$ docker push aib2021marcello/blogger:rplotter

    3. Verificar se a imagem está no Docker Hub:

    4. Fazer pull da imagem no registry (poderia ser feito em qualquer computador com docker, sem precisar da autenticação, uma vez que o repositório é público):

home@marcello:~$ docker pull aib2021marcello/blogger:rplotter

    5. Começar a dockerizar o que quiser!

sexta-feira, 13 de novembro de 2020

[IDS] Docker: Instalação em Debian-based OS

SET UP THE REPOSITORY

1. Update the apt package index and install packages to allow apt to use a repository over HTTPS:

$ sudo apt-get update

$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

2. Add Docker’s official GPG key:

$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -

Verify that you now have the key with the fingerprint 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88, by searching for the last 8 characters of the fingerprint.

$ sudo apt-key fingerprint 0EBFCD88

pub   4096R/0EBFCD88 2017-02-22
      Key fingerprint = 9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid                  Docker Release (CE deb) <docker@docker.com>
sub   4096R/F273FCD8 2017-02-22

3. Use the following command to set up the stable repository. To add the nightly or test repository, add the word nightly or test (or both) after the word stable in the commands below.

$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"

INSTALL DOCKER ENGINE

1.Update the apt package index, and install the latest version of Docker Engine and containerd

 $ sudo apt-get update
 $ sudo apt-get install docker-ce docker-ce-cli containerd.io

2. Verify that Docker Engine is installed correctly by running the hello-world image.

$ sudo docker run hello-world

domingo, 1 de novembro de 2020

[IDS] Side projects: Cariogamia

    Nunca gostei de "não" fazer nada quando não estava a estudar, então sempre "inventava" um trabalho ou projecto para desenvolver relacionado ou não com a escola. Uma vez, para estudar os processos e conceitos que conduzem à formação de organismos embrionários humanos (replicação semi-conservativa, cilco de vida diplonte, cariogamia, reprodução sexuada, fecundação, meiose reducional e equacional) desenvolvi um programa simples que gerava, de forma aleatória, os cromossomas parentais e atribuía o valor -1,0 ou 1 para constituinte do par, de modo a criar os oitos gâmetas, escolher dois, criar o cariótipo do organismo resultante e exportar o ficheiro .CSV com as características. O importante era estudar a formação de gâmetas e estudar estruturas de dados que podiam solucionar os problemas que encontrava.
    Uma vez, alguém que respeito muito, perguntou qual tinha sido o meu melhor e mais desafiante projecto e eu, incapaz de escolher, enumerei os meus "side projects" por ordem cronológica. Ainda que não soubesse responder, tinha alguma coisa para responder! Provavelmente se não tivesse alguma resposta não teriam feito a pergunta! :)

"I don't care that they stole my idea... I care that they don't have any of their own" - Nikola Tesla

Para alguém que está perdido, pode ser útil pesquisar ideias de projectos... (ver https://www.codementor.io/@npostolovski/40-side-project-ideas-for-software-engineers-g8xckyxef)  ainda que para mim todo bom projecto inicia com uma abstração motivada pela mente, sem razões ou obrigatoriedades externas. 

Um exemplo do ficheiro .CSV exportado:

,Número do par de cromossomas,Características,Atributos
0,1,Alzheimer,"[[1], [0]]"
1,2,Cancro Colorretal,"[[1], [0]]"
2,5,Asma,"[[1], [-1]]"
3,11,Albinismo,"[[0], [1]]"
4,13,Cancro de Mama,"[[0], [0]]"
5,14,Alzheimer,"[[0], [-1]]"
6,15,Albinismo e Olhos Castanhos/Azuis,"[[-1, 1], [0, 1]]"
7,16,Cancro Colorretal e Cerrume e Pigmentação da pele,"[[1, 0, -1], [-1, 0, 0]]"
8,19,Alzheimer e Olhos Verdes,"[[1, 0], [1, -1]]"
9,20,Altura,"[[0], [1]]"
10,21,Alzheimer,"[[0], [1]]"
11,22,Transtorno Bipolar,"[[1], [1]]"
12,23,Cromossomas Sexuais,"['Y', 'X']"

quinta-feira, 22 de outubro de 2020

[IDS] Estrutura do ambiente de desenvolvimento: rplotter

    Qualquer software bem estruturado divide cada uma das funcionalidades em tantas parcelas quantas possíveis e quantas necessárias forem para melhor desenvolvê-las. Somente desta forma, com a "divisão do código" por propósito e utilidade, os pequenos erros são mais facilmente removidos e alterados.
    O exemplo apresentado abaixo demonstra a estrutura do "rplotter", um simples programa desenvolvido por mim para automatizar o processo de geração semanal de gráficos (apresentados em meetings):

home@marcello:~/development/release/rplotter$ ls
assets  main.pdf  main.tex  first  second
    
    Ao nível de código, foram desenvolvidos dois grandes blocos: 'first' e 'second'. Para o directório 'first':

home@marcello:~/development/release/rplotter$ cd first/ && ls
assets  exe  source
    
    Em 'exe' ficam os binários, mas o código-fonte fica em 'source':

home@marcello:~/development/release/rplotter/first$ cd source/ && ls
chart  example  main.sh  packages  setup.sh
    
    No directório 'chart' estão todas as classes que geram os gráficos, em 'example' estão os ficheiros definidos como default e em 'packages' estão as dependências da aplicação.
    E se, houver erro no processamento dos dados importados?
    - Em rplotter/first/chart/processing/import a classe read está definida, portanto pode ser onde o erro é originado. 
    Analogamente, um erro na exportação do gráfico pode estar em rplotter/first/chart/processing/export, onde as classes get_plot e saveas estão definidas.

    Em suma, uma estrutura sólida e bem construída proporciona um ambiente de desenvolvimento saudável, limpo e preparado para qualquer processo de debug.

Figura 1: Exemplo de output da aplicação