|
| 1 | +--- |
| 2 | +title: Configuração do ambiente da workshop |
| 3 | +--- |
| 4 | + |
| 5 | +# Configuração do ambiente da workshop |
| 6 | + |
| 7 | +Nesta workshop, utilizamos os seguintes materiais: |
| 8 | + |
| 9 | +1. **Documentação** - (como esta página): aceda à versão mais recente em [dive.pygeoapi.io](https://dive.pygeoapi.io) |
| 10 | +2. **Exercícios** - descarregue o [ficheiro zip mais recente](https://github.com/geopython/diving-into-pygeoapi/archive/refs/heads/main.zip), extraia o conteúdo e encontre os exercícios em `workshop/exercises` [^1] |
| 11 | +3. **Docker** - todos os exemplos/exercícios são executados num `contentor Docker` em `workshop/exercises` |
| 12 | + |
| 13 | +[^1]: Em alternativa, pode fazer um *fork*/clonar o repositório GitHub desta workshop diretamente de <https://github.com/geopython/diving-into-pygeoapi>. |
| 14 | + |
| 15 | +## Editor de Texto |
| 16 | + |
| 17 | +O seu editor de texto deve ser capaz de editar ficheiros de configuração em **texto simples**. Abaixo estão algumas opções de editores de texto (pode haver outros), juntamente com o que alguns dos programadores da pygeoapi preferem usar: |
| 18 | + |
| 19 | +* Notepad ou Notepad++ (Windows) |
| 20 | +* Sublime Text: Angelos |
| 21 | +* PyCharm: Just |
| 22 | +* Emacs: Just |
| 23 | +* Visual Studio Code: Francesco, Angelos, Joana |
| 24 | +* `vi` / `vim`: Tom, Angelos |
| 25 | + |
| 26 | +Dito isto, sinta-se à vontade para usar o que funciona melhor para si :) |
| 27 | + |
| 28 | +## YAML |
| 29 | + |
| 30 | +A maioria dos exercícios focar-se-á na edição da [configuração](https://docs.pygeoapi.io/en/latest/configuration.html) da pygeoapi, que está no formato [YAML](https://yaml.org). Se não estiver familiarizado com YAML, vale a pena ler um [tutorial](https://www.cloudbees.com/blog/yaml-tutorial-everything-you-need-get-started) para se familiarizar com a sintaxe e a indentação do YAML. |
| 31 | + |
| 32 | +O requisito principal para a formação é instalar o Docker e/ou o Docker Compose no seu sistema. |
| 33 | +Aconselhamos vivamente a instalação do Docker antes do início da workshop. |
| 34 | + |
| 35 | +Embora sejam possíveis vários cenários de instalação personalizada (consulte a [documentação](https://docs.pygeoapi.io/en/latest/installation.html) para mais informações), estes não são considerados nesta workshop, dada a capacidade de instalar um ambiente totalmente reprodutível através do Docker e do Docker Compose. |
| 36 | + |
| 37 | +Os Exercícios da Workshop também serão baseados no Docker, pelo que uma instalação personalizada seria, no mínimo, 'desafiadora'. |
| 38 | +A boa notícia é que apenas uma única instalação (Docker) é necessária! As imagens Docker utilizadas nesta workshop contêm a versão mais recente da pygeoapi e todas as suas dependências e serviços externos (ex: PostGIS). |
| 39 | + |
| 40 | +## Sobre o Docker |
| 41 | + |
| 42 | +O Docker está disponível desde 2013 e é fornecido como uma opção de implementação em inúmeros projetos de software FOSS e da OSGeo. Dada a era atual da computação, é provável que já tenha ouvido falar do Docker e de *contentorização*. Ou, talvez, já esteja familiarizado e, esperamos, já a utilizar o Docker. |
| 43 | +Se não for o caso, existe uma abundância de materiais introdutórios que podem ser encontrados online, como este [tutorial da IBM](https://www.ibm.com/topics/docker). |
| 44 | + |
| 45 | +O software FOSS4G beneficiou enormemente do Docker (padrões consistentes de empacotamento, isolamento, integração e atualização) em comparação com as instalações personalizadas. Embora hoje utilizemos principalmente o Docker, a visão geral é o uso de **Contentores** como o próximo passo na virtualização. A contentorização certamente merece uma workshop própria, portanto, para os fins desta workshop, abordaremos apenas os conceitos básicos do Docker e do Docker Compose. |
| 46 | + |
| 47 | +O [Docker Compose](https://docs.docker.com/compose) é um complemento do Docker para facilitar a orquestração (configuração) de um ou mais 'Contentores' Docker (um Contentor é uma instância em execução de uma imagem Docker) usando uma convenção de configuração (o ficheiro YAML do Docker Compose), geralmente chamado `docker-compose.yml`. |
| 48 | + |
| 49 | +Num patamar superior, existem orquestradores Docker ainda mais sofisticados, como o [Rancher](https://rancher.com/products/rancher) e o [Kubernetes](https://kubernetes.io), mas para esta workshop, o Docker e o Docker Compose são tudo o que precisamos. |
| 50 | + |
| 51 | +## Instalação |
| 52 | + |
| 53 | +A instalação do Docker progrediu muito ao longo dos anos. Esta é a única parte da workshop que depende do sistema/SO que está a utilizar (ex: Windows, Mac ou Linux). Para cada sistema, o site do Docker fornece instruções de instalação detalhadas. Por favor, siga-as de forma consistente. |
| 54 | + |
| 55 | +Para muitas plataformas, está disponível um produto chamado [Docker Desktop](https://docs.docker.com/desktop), que inclui os principais componentes do Docker: |
| 56 | + |
| 57 | +* Instalação para [Windows](https://docs.Docker.com/desktop/install/windows-install) |
| 58 | +* Instalação para [Mac](https://docs.Docker.com/desktop/install/mac-install) |
| 59 | +* Instalação para [Linux](https://docs.Docker.com/desktop/install/linux-install) |
| 60 | + |
| 61 | +Algumas notas: |
| 62 | + |
| 63 | +* No Windows, recomendamos o uso do [Subsistema Windows para Linux](https://docs.microsoft.com/en-us/windows/wsl) (WSL), pois também fornece uma linha de comandos poderosa (Bash) e tem uma integração ótima com o Docker. Antes de instalar o Docker Desktop, instale o WSL abrindo o Microsoft PowerShell (executar como administrador) e executando `wsl --install` |
| 64 | + * **a instalação do WSL requer privilégios de administrador no seu sistema** |
| 65 | +* No Mac, se estiver a usar o [Homebrew](https://brew.sh), considere (como o autor fez) usar a [fórmula Docker do brew](https://formulae.brew.sh/formula/Docker) |
| 66 | +* No Mac OSX Monterey e posterior, pode haver um problema com a porta local 5000 já em uso, entrando em conflito com a porta padrão usada pelo contentor da pygeoapi. Se vir este erro `OSError: [Errno 48] Address already in use`, precisa de desativar o *Recetor Airplay*. Vá a `Definições do Sistema | Partilha` ou, como no Sonoma, escreva 'airplay' na caixa de pesquisa. Veja a imagem abaixo para o Mac OSX Sonoma. Há também uma descrição detalhada [nesta publicação de blog](https://progressstory.com/tech/port-5000-already-in-use-macos-monterey-issue/). |
| 67 | + |
| 68 | +* No Linux, pode escolher o instalador relevante para a sua plataforma. Pode também usar o Virtualbox com uma Imagem Ubuntu ou usar uma VM na nuvem. |
| 69 | +* No Linux, ao encontrar problemas de permissão: o *daemon* do Docker normalmente é executado como "root". Isto requer que os comandos sejam prefixados com `sudo` como um utilizador não-root. Na maioria das distribuições, o Docker é acessível por utilizadores no grupo `docker`. Pode omitir o uso de `sudo` e prevenir outros possíveis problemas de permissão da seguinte forma: |
| 70 | + * Teste se o grupo `docker` existe: `cat /etc/group | grep docker`. |
| 71 | + * Se não existir: `sudo groupadd docker`. |
| 72 | + * Adicione o seu utilizador a este grupo: `sudo usermod -aG docker $USER` |
| 73 | + * Faça log-out e log-in. |
| 74 | + * Veja todos os detalhes e mais opções [nesta instrução](https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user). |
| 75 | +* O Docker Desktop inclui uma interface gráfica com algumas opções interessantes. Pode ver logs e informações sobre os contentores em execução, abrir o serviço deles num navegador ou até mesmo abrir um terminal dentro do contentor. |
| 76 | + |
| 77 | +Se tudo correr bem, deverá conseguir executar o Docker a partir da linha de comandos da seguinte forma: [^2] |
| 78 | + |
| 79 | +=== "Linux/Mac" |
| 80 | + |
| 81 | + <div class="termy"> |
| 82 | + ```bash |
| 83 | + docker version |
| 84 | + Docker version 20.10.17, build 100c701 |
| 85 | + |
| 86 | + docker compose version |
| 87 | + Docker Compose version v2.6.1 |
| 88 | + ``` |
| 89 | + </div> |
| 90 | + |
| 91 | +=== "Windows (PowerShell)" |
| 92 | + |
| 93 | + <div class="termy"> |
| 94 | + ```bash |
| 95 | + docker version |
| 96 | + Docker version 20.10.17, build 100c701 |
| 97 | + |
| 98 | + docker compose version |
| 99 | + Docker Compose version v2.6.1 |
| 100 | + ``` |
| 101 | + </div> |
| 102 | + |
| 103 | +(Não é necessário que os números da sua versão correspondam exatamente). |
| 104 | +[^2]: Para versões recentes do Docker, execute `docker compose version` |
| 105 | + |
| 106 | + |
| 107 | +## Início Rápido |
| 108 | + |
| 109 | +Assim que o Docker estiver disponível no seu sistema, executar o contentor da pygeoapi com a sua configuração e dados incorporados é uma única linha de comando. |
| 110 | + |
| 111 | +Abra uma sessão de terminal e execute: |
| 112 | + |
| 113 | +!!! question "Primeira execução via Docker" |
| 114 | + |
| 115 | + === "Linux/Mac" |
| 116 | + |
| 117 | + <div class="termy"> |
| 118 | + ```bash |
| 119 | + docker run --rm -p 5000:80 geopython/pygeoapi:latest |
| 120 | + Unable to find image 'geopython/pygeoapi:latest' locally |
| 121 | + latest: Pulling from geopython/pygeoapi |
| 122 | + d7bfe07ed847: Already exists |
| 123 | + d5d0144a7164: Already exists |
| 124 | + afe0923a0fa0: Already exists |
| 125 | + 75f8618c4e86: Already exists |
| 126 | + c603397fd6ad: Already exists |
| 127 | + 6584a95328b3: Already exists |
| 128 | + fd93e44631d9: Already exists |
| 129 | + 6a3201071a5d: Already exists |
| 130 | + 4f4fb700ef54: Already exists |
| 131 | + Digest: sha256:27b2b219497a6ea382a946ee90ae96ad00b5c1d8e9b725fccf23211978fef124 |
| 132 | + Status: Downloaded newer image for geopython/pygeoapi:latest |
| 133 | + START /entrypoint.sh |
| 134 | + Trying to generate openapi.yml |
| 135 | + openapi.yml generated continue to pygeoapi |
| 136 | + make SCRIPT_NAME empty from / |
| 137 | + Start gunicorn name=pygeoapi on 0.0.0.0:80 with 4 workers and SCRIPT_NAME= |
| 138 | + [2022-08-09 12:59:00 +0000] [1] [INFO] Starting gunicorn 20.0.4 |
| 139 | + [2022-08-09 12:59:00 +0000] [1] [INFO] Listening at: http://0.0.0.0:80 (1) |
| 140 | + [2022-08-09 12:59:00 +0000] [1] [INFO] Using worker: gevent |
| 141 | + [2022-08-09 12:59:00 +0000] [18] [INFO] Booting worker with pid: 18 |
| 142 | + [2022-08-09 12:59:00 +0000] [19] [INFO] Booting worker with pid: 19 |
| 143 | + [2022-08-09 12:59:00 +0000] [21] [INFO] Booting worker with pid: 21 |
| 144 | + [2022-08-09 12:59:00 +0000] [22] [INFO] Booting worker with pid: 22 |
| 145 | + ``` |
| 146 | + </div> |
| 147 | + |
| 148 | + === "Windows (PowerShell)" |
| 149 | + |
| 150 | + <div class="termy"> |
| 151 | + ```bash |
| 152 | + docker run --rm -p 5000:80 geopython/pygeoapi:latest |
| 153 | + Unable to find image 'geopython/pygeoapi:latest' locally |
| 154 | + latest: Pulling from geopython/pygeoapi |
| 155 | + d7bfe07ed847: Already exists |
| 156 | + d5d0144a7164: Already exists |
| 157 | + afe0923a0fa0: Already exists |
| 158 | + 75f8618c4e86: Already exists |
| 159 | + c603397fd6ad: Already exists |
| 160 | + 6584a95328b3: Already exists |
| 161 | + fd93e44631d9: Already exists |
| 162 | + 6a3201071a5d: Already exists |
| 163 | + 4f4fb700ef54: Already exists |
| 164 | + Digest: sha256:27b2b219497a6ea382a946ee90ae96ad00b5c1d8e9b725fccf23211978fef124 |
| 165 | + Status: Downloaded newer image for geopython/pygeoapi:latest |
| 166 | + START /entrypoint.sh |
| 167 | + Trying to generate openapi.yml |
| 168 | + openapi.yml generated continue to pygeoapi |
| 169 | + make SCRIPT_NAME empty from / |
| 170 | + Start gunicorn name=pygeoapi on 0.0.0.0:80 with 4 workers and SCRIPT_NAME= |
| 171 | + [2022-08-09 12:59:00 +0000] [1] [INFO] Starting gunicorn 20.0.4 |
| 172 | + [2022-08-09 12:59:00 +0000] [1] [INFO] Listening at: http://0.0.0.0:80 (1) |
| 173 | + [2022-08-09 12:59:00 +0000] [1] [INFO] Using worker: gevent |
| 174 | + [2022-08-09 12:59:00 +0000] [18] [INFO] Booting worker with pid: 18 |
| 175 | + [2022-08-09 12:59:00 +0000] [19] [INFO] Booting worker with pid: 19 |
| 176 | + [2022-08-09 12:59:00 +0000] [21] [INFO] Booting worker with pid: 21 |
| 177 | + [2022-08-09 12:59:00 +0000] [22] [INFO] Booting worker with pid: 22 |
| 178 | + ``` |
| 179 | + </div> |
| 180 | + |
| 181 | + |
| 182 | +É tudo! Abra o seu navegador e navegue para `http://localhost:5000`, a página da pygeoapi será exibida. |
| 183 | +Como parte da execução inicial do `docker run`, o Docker descarregará a Imagem Docker da pygeoapi do [Docker Hub](https://hub.Docker.com/r/geopython/pygeoapi). |
| 184 | +Isto pode levar algum tempo, pois a imagem Docker inclui todas as dependências (como GDAL, etc.). Seja paciente! Este é um download único para toda a workshop, ou pode querer fazê-lo antecipadamente. |
| 185 | + |
| 186 | +Algumas notas: |
| 187 | + |
| 188 | +* O Docker executa um contentor da pygeoapi no seu sistema local na porta 5000, que é mapeada para a porta 80 dentro do contentor. |
| 189 | +* o contentor Docker da pygeoapi é executado com a [configuração padrão](https://github.com/geopython/pygeoapi/blob/master/docker/default.config.yml) e os dados do repositório GitHub. |
| 190 | +* tanto a configuração como os dados (do repositório GitHub) estão incorporados na Imagem Docker - iremos substituí-los mais tarde. |
| 191 | +* a opção `--rm` remove o Contentor Docker (mas não a imagem), após a execução. |
| 192 | +* pressione `CTRL-C` para parar o contentor e voltar ao terminal. |
| 193 | + |
| 194 | +De seguida, pode substituir a configuração padrão e adicionar os seus próprios dados usando [volumes Docker](https://docs.Docker.com/storage/volumes). |
| 195 | + |
| 196 | +## Personalizar a configuração |
| 197 | + |
| 198 | +Nos próximos exercícios, vamos atualizar o ficheiro de configuração várias vezes. |
| 199 | +Para facilitar o desenvolvimento, vamos substituir a configuração da pygeoapi que reside por padrão em `/pygeoapi/local.config.yml` dentro do contentor por um ficheiro local que pode editar no seu editor de texto favorito. |
| 200 | + |
| 201 | +!!! question "Substituir o ficheiro de configuração da pygeoapi" |
| 202 | + |
| 203 | + Descarregue a configuração Docker padrão da pygeoapi de [default.config.yml](https://raw.githubusercontent.com/geopython/pygeoapi/master/docker/default.config.yml) para a pasta atual (ou navegue para a pasta onde descarregou o ficheiro), por exemplo com: |
| 204 | + |
| 205 | + === "Linux/Mac" |
| 206 | + |
| 207 | + <div class="termy"> |
| 208 | + ```bash |
| 209 | + curl -O https://raw.githubusercontent.com/geopython/pygeoapi/master/docker/default.config.yml |
| 210 | + ``` |
| 211 | + </div> |
| 212 | + |
| 213 | + === "Windows (PowerShell)" |
| 214 | + |
| 215 | + <div class="termy"> |
| 216 | + ```bash |
| 217 | + curl https://raw.githubusercontent.com/geopython/pygeoapi/master/docker/default.config.yml |
| 218 | + ``` |
| 219 | + </div> |
| 220 | + |
| 221 | + Abra o ficheiro no seu editor de texto favorito e altere o título e a descrição da API: |
| 222 | + |
| 223 | + ``` {.yml linenums="59"} |
| 224 | + metadata: |
| 225 | + identification: |
| 226 | + title: A minha primeira execução da pygeoapi |
| 227 | + description: a pygeoapi fornece uma API para dados geoespaciais |
| 228 | + ``` |
| 229 | + |
| 230 | + Agora execute o contentor com o ficheiro de configuração substituído: |
| 231 | + |
| 232 | + === "Linux/Mac" |
| 233 | + |
| 234 | + <div class="termy"> |
| 235 | + ```bash |
| 236 | + docker run -p 5000:80 \ |
| 237 | + -v $(pwd)/default.config.yml:/pygeoapi/local.config.yml \ |
| 238 | + geopython/pygeoapi:latest |
| 239 | + ``` |
| 240 | + </div> |
| 241 | + |
| 242 | + === "Windows (PowerShell)" |
| 243 | + |
| 244 | + <div class="termy"> |
| 245 | + ```bash |
| 246 | + docker run -p 5000:80 -v ${pwd}/default.config.yml:/pygeoapi/local.config.yml geopython/pygeoapi:latest |
| 247 | + ``` |
| 248 | + </div> |
| 249 | + |
| 250 | + Neste ponto, navegue para `http://localhost:5000` para verificar o novo título e descrição. |
| 251 | + |
| 252 | +!!! note |
| 253 | + |
| 254 | + No Windows, o ficheiro descarregado pode ser renomeado para `default.config.yml.txt`. Certifique-se de renomear o ficheiro para `default.config.yml`. |
| 255 | + |
| 256 | + |
| 257 | +Ao usar uma montagem de volume Docker (opção `-v`), o Docker anexa ou 'monta' um diretório ou um único ficheiro do seu sistema anfitrião/local no Contentor Docker. |
| 258 | + |
| 259 | +No trecho de código acima, `$(pwd)` indica a pasta de trabalho a partir da qual inicia o contentor Docker. |
| 260 | + |
| 261 | +## Adicionar dados e definir o ficheiro de configuração |
| 262 | + |
| 263 | +Além de adaptar a configuração, geralmente adicionará os seus próprios dados como ficheiros ou serviços de dados remotos como PostGIS ou WFS. |
| 264 | + |
| 265 | +Também pode montar um diretório local como `data/` para `/pygeoapi/mydata` dentro do Contentor. |
| 266 | +Dentro do diretório de dados, pode armazenar dados vetoriais, ficheiros raster ou conjuntos de imagens de mosaicos vetoriais. |
| 267 | + |
| 268 | +Abaixo está um exemplo onde a configuração é explicitamente definida para `pygeoapi-config.yml` através de uma variável de ambiente (`-e`) e usa uma montagem Docker para montar a pasta local `data` como `/pygeoapi/mydata`: |
| 269 | + |
| 270 | +=== "Linux/Mac" |
| 271 | + |
| 272 | + <div class="termy"> |
| 273 | + ```bash |
| 274 | + docker run -p 5000:80 \ |
| 275 | + -v $(pwd)/data:/pygeoapi/mydata \ |
| 276 | + -v $(pwd)/default.config.yml:/pygeoapi/pygeoapi-config.yml \ |
| 277 | + -e PYGEOAPI_CONFIG=/pygeoapi/pygeoapi-config.yml \ |
| 278 | + geopython/pygeoapi:latest |
| 279 | + ``` |
| 280 | + </div> |
| 281 | + |
| 282 | +=== "Windows (PowerShell)" |
| 283 | + |
| 284 | + <div class="termy"> |
| 285 | + ```bash |
| 286 | + docker run -p 5000:80 -v ${pwd}/data:/pygeoapi/mydata -v ${pwd}/default.config.yml:/pygeoapi/pygeoapi-config.yml -e PYGEOAPI_CONFIG=/pygeoapi/pygeoapi-config.yml geopython/pygeoapi:latest |
| 287 | + ``` |
| 288 | + </div> |
| 289 | + |
| 290 | +Nas próximas secções, analisaremos exemplos adicionais de montagens na pasta de dados. Mais exemplos de implementação do Docker podem ser encontrados no [repositório GitHub da pygeoapi](https://github.com/geopython/pygeoapi/tree/master/docker/examples). |
| 291 | + |
| 292 | +## Usar o Docker para Clientes Python |
| 293 | + |
| 294 | +Em alguns exercícios, acedemos a *endpoints* remotos da `pygeoapi` usando a [OWSLib](https://owslib.readthedocs.io), uma biblioteca Python para interagir com os Serviços Web da OGC. A OWSLib pode ser instalada usando o comando padrão do Python `pip3 install OWSLib`, mas pode não ter o Python disponível, ou querer manter o seu sistema 'limpo'. |
| 295 | + |
| 296 | +Como o Docker já está disponível no seu sistema, pode iniciar um Contentor com um ambiente Python completo e acedê-lo a partir de um *prompt* de shell `bash`. A linha mágica é: |
| 297 | + |
| 298 | +`docker run -it --rm --network=host --name owslib python:3.10-slim /bin/bash` |
| 299 | + |
| 300 | +Isto irá descarregar uma Imagem Docker oficial e pequena (125MB) do Python. Quando o Contentor é iniciado, é direcionado para uma sessão/*prompt* `bash`. O argumento `--network=host` permite que interaja diretamente com os serviços no seu sistema anfitrião, portanto com a `pygeoapi`, sem configurar uma rede Docker. A partir daí, pode iniciar o `python3`, instalar a OWSLib e talvez até outras ferramentas como `curl` e `wget`. |
| 301 | + |
| 302 | +Abaixo está um exemplo completo, assumindo que a pygeoapi está a ser executada no seu `localhost` na porta 5000: |
| 303 | + |
| 304 | +=== "Linux/Mac" |
| 305 | + |
| 306 | + <div class="termy"> |
| 307 | + ```bash |
| 308 | + docker run -it --rm --network=host --name owslib python:3.10-slim /bin/bash |
| 309 | + Unable to find image 'python:3.10-slim' locally |
| 310 | + 3.10-slim: Pulling from library/python |
| 311 | + 5b5fe70539cd: Pull complete |
| 312 | + f4b0e4004dc0: Pull complete |
| 313 | + c5424f0ac885: Pull complete |
| 314 | + 9d21fe1624ec: Pull complete |
| 315 | + de0194aa1c21: Pull complete |
| 316 | + Digest: sha256:7dc5b4e948acd18c1633b0e593ad0224298646612ce7d0b5ac6d4e17616d7e4b |
| 317 | + Status: Downloaded newer image for python:3.10-slim |
| 318 | + |
| 319 | + root@docker-desktop:/# pip3 install owslib |
| 320 | + root@docker-desktop:/# python3 |
| 321 | + >>> from owslib.ogcapi.features import Features |
| 322 | + >>> w = Features('http://localhost:5000') |
| 323 | + >>> w |
| 324 | + <owslib.ogcapi.features.Features object at 0x7ff493e6f850> |
| 325 | + >>> conformance = w.conformance() |
| 326 | + >>> conformance |
| 327 | + etc |
| 328 | + |
| 329 | + ``` |
| 330 | + </div> |
| 331 | + |
| 332 | +=== "Windows (PowerShell)" |
| 333 | + |
| 334 | + <div class="termy"> |
| 335 | + ```bash |
| 336 | + docker run -it --rm --network=host --name owslib python:3.10-slim /bin/bash |
| 337 | + Unable to find image 'python:3.10-slim' locally |
| 338 | + 3.10-slim: Pulling from library/python |
| 339 | + 5b5fe70539cd: Pull complete |
| 340 | + f4b0e4004dc0: Pull complete |
| 341 | + c5424f0ac885: Pull complete |
| 342 | + 9d21fe1624ec: Pull complete |
| 343 | + de0194aa1c21: Pull complete |
| 344 | + Digest: sha256:7dc5b4e948acd18c1633b0e593ad0224298646612ce7d0b5ac6d4e17616d7e4b |
| 345 | + Status: Downloaded newer image for python:3.10-slim |
| 346 | + |
| 347 | + root@docker-desktop:/# pip3 install owslib |
| 348 | + root@docker-desktop:/# python3 |
| 349 | + >>> from owslib.ogcapi.features import Features |
| 350 | + >>> w = Features('http://localhost:5000') |
| 351 | + >>> w |
| 352 | + <owslib.ogcapi.features.Features object at 0x7ff493e6f850> |
| 353 | + >>> conformance = w.conformance() |
| 354 | + >>> conformance |
| 355 | + etc |
| 356 | + |
| 357 | + ``` |
| 358 | + </div> |
| 359 | + |
| 360 | +Faremos referência a esta instalação em alguns dos Exercícios onde a OWSLib é utilizada. |
0 commit comments