Category: Linux

Solucionar error en Docker para Centos8: client version 1.40 is too new

Llevo usando Centos 8 hace varios meses para hacer laboratorios y pruebas, estaba armando un Dockerfile y cuando quise probarlo encontré este mensaje de error:

Docker: “Error response from daemon: client version 1.40 is too new. Maximum supported API version is 1.39”

Lo curioso era que si podía levantar contenedores, el problema radica cuando invocas cualquier comando que quiera comunicarse con el daemon de docker, me puse a investigar y encontré el problema:
This is known issue with docker client 19.03.09. It happens if the daemon version supports only max api-version 1.39. Client is not downgrading the API version to match the server supported version automatically. It should be fixed in 19.03.10.
https://github.com/docker/cli/issues/2533

Tal y como refieren en el issue hay un problema conocido y se puede solucionar de 2 maneras, la forma rápida es exportar una variable de entorno especificando la version de API que quieres usar
export DOCKER_API_VERSION=1.39

Pero yo prefiero la solución permanente que es hacer el upgrade y asi no tengo que lanzar esa variable de entorno cada vez que quiera usar el daemon o meter una línea más en mi .bashrc

En centos uso el repo oficial de docker, pero al querer hacer el update encontré este error
[root@behemoth ~]# yum update
Last metadata expiration check: 0:00:07 ago on Sat 11 Jul 2020 12:35:05 PM -05.
Error:
Problem: package docker-ce-3:19.03.12-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but none of the providers can be installed
- cannot install the best update candidate for package docker-ce-3:18.09.1-3.el7.x86_64
- package containerd.io-1.2.10-3.2.el7.x86_64 is filtered out by modular filtering

Tenía que hacer upgrade al paquete containerd pero la versión que necesito no esta disponible a traves del repo, asi que busqué y encontré el rpm que necesitaba, para instalarlo ejecutan
yum install -y https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm

Y luego de eso ya podrán hacer el upgrade de la versión de Docker sin problemas
# yum update
Last metadata expiration check: 0:02:13 ago on Sat 11 Jul 2020 12:35:05 PM -05.
Dependencies resolved.
=============================================================================
Package Arch Version Repository Size
=============================================================================
Upgrading:
docker-ce x86_64 3:19.03.12-3.el7 docker-ce-stable 24 M
docker-ce-cli x86_64 1:19.03.12-3.el7 docker-ce-stable 38 M

Transaction Summary
=============================================================================
Upgrade 2 Packages

Total download size: 62 M
Is this ok [y/N]: y
Downloading Packages:
(1/2): docker-ce-19.03.12-3.el7.x86_64.rpm 1.3 MB/s | 24 MB 00:17
(2/2): docker-ce-cli-19.03.12-3.el7.x86_64.r 1.7 MB/s | 38 MB 00:21

Espero les resulte útil

Pyenv para tener distintas versiones de Python

Python Cuando programas en Python es común que hagas uso de muchas librerías y en algún momento necesites una versión muy específica de Python para tu desarrollo. Muchos de estos problemas se pueden solucionar con Docker, sin embargo, no siempre podemos encontrar exactamente lo que buscamos o resulta complicado construirlo si no tenemos una buena base sobre lo que es contenedores.

En algunas distribuciones de Linux es común que tengas instaladas 2 versiones de Python, una de la rama 2.x que por cierto ya va quedando obsoleta y otra versión de la rama 3.x, para descubrir que versión de Python tenemos ejecutamos:
python --version
o
python3 --version

En mi caso estoy corriendo Centos8 y tengo la versión 3.6.8

Pyenv es un programa que nos permite poder instalar distintas versiones de Python y decidir qué versión específica queremos usar en cualquier momento, asi que el primer paso es instalar pyenv, el proceso es bastante sencillo:
git clone https://github.com/pyenv/pyenv.git ~/.pyenv

Con eso se instalará pyenv en tu home directory, ahora tendrás que añadir unas líneas a tu archivo .bashrc que sirven para aumentar una ruta a tu path y activar pyenv cada vez que inicies una nueva sesión.
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bashrc

Con estos pasos tendremos pyenv funcionando, puedes verificar la versión instalada ejecutando
pyenv version

Para ver todas las versiones de Python y programas accesorios (anaconda, stackless, miniconda, etc etc) que puedes instalar ejecutas
pyenv install --list | more

Para nuestro ejemplo vamos a instalar una versióm de Python2 y una de Python3, antes de empezar con la instalación hay un paso muy importante que es asegurarse de que tu distribución tiene instalado todo lo necesario para compilar desde fuentes, hablamos de tener gcc, make, etc etc.

Si usas Ubuntu, Debian o derivados ejecuta:

sudo apt-get install -y make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev \
libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python-openssl

Si usas RedHat/Centos/Fedora o derivados ejecuta:
sudo yum groupinstall "Development Tools"
sudo yum install zlib-devel bzip2 bzip2-devel readline-devel sqlite \
sqlite-devel openssl-devel xz xz-devel libffi-devel

Con esto debería ser suficiente para instalar cualquier versión de python, empezaremos con la versión 2.7.9
pyenv install 2.7.9

Una vez que se descargue el código fuente de nuestra versión se compilará en nuestra PC, esto puede tardar un poco dependiendo de la potencia que tengas. Cuando termine puedes verificar que se instalo con el comando
pyenv versions

Eso te mostrará todas las versiones de python instaladas, otra forma de verificar es observando el contenido de nuestro directorio versions en nuestro home directory
ls ~/.pyenv/versions/

Eso significa que para desinstalar alguna versión bastaría con remover el directorio que le corresponde con un rm, pero prefiero usar pyenv para ese propósito
pyenv uninstall 2.7.9

Ahora voy a instalar la última versión de Python disponible, al momento de escribir este post era la versión 3.8.3
pyenv install 3.8.3

Si todo sale bien debes tener como mínimo 2 versiones de Python, en mi caso
$ pyenv versions
* system
2.7.9
3.8.3

El asterisco señala la versión activa de python, en mi caso es la 3.6.8 que viene por defecto en el sistema, para cambiar la versión activa sólo debes ejecutar:
$pyenv global 3.8.3
system
2.7.9
* 3.8.3

Si quieres probar el shell interactivo de alguna versión de python que tengas instalada debes ejecutar:
pyenv shell 2.7.9

Virtual Enviroments
Una vez resuelto el tema de manejar las distintas versiones de Python ahora viene otra parte importante que es manejar los virtual enviroments, hay varias formas de hacerlas, yo recomiendo instalar un plugin de pyenv que sirve especificamente para este propósito: pyenv-virtualenv

git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv

De forma opcional pero recomendada, ejecutamos el siguiente comando que lo que hace es agregar una línea a tu archivo .bash_profile que hará que tengas el plugin disponible en todo momento.
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile

Para crear un entorno virtual que se llame “proyecto1” con la versión 3.8.3 de python ejecutamos
pyenv virtualenv 3.8.3 proyecto1

Si no especificas la versión de Python se creará el entorno con la versión por defecto
pyenv virtualenv proyecto2

Para ver la lista de entornos virtuales ejecutas:
pyenv virtualenvs

Para activar un entorno virtual
pyenv activate proyecto1

Para desactivar un entorno virtual
pyenv deactivate

Para borrar un entorno virtual
pyenv virtualenv-delete proyecto2

¿Bastante fácil verdad?

He cubierto sólo lo básico para empezar, puedes hacer muchas cosas más, espero que te haya sido de utilidad! Happy hacking 🙂

tput para mejorar tus scripts en bash

bash
Cuando escribes scripts en bash acostumbras a hacerlo todo simple, sin embargo hay ocasiones en las cuales quieres tener un mayor control de la salida del programa. Una de las herramientas que sirve para este propósito es tput que viene por defecto instalado con ncurses, en muchas distribuciones ncurses viene instalado por defecto, asi que no debería ser problema.

La idea de usar tput es poder controlar de una forma sencilla distintos aspectos de tu terminal y hacer algunas cosas divertidas como dar formato y poner texto en negritas o de colores por citar un ejemplo, a continuación daré una lista de usos para tput que para mí resultaron especialmente útiles.

Limpiar pantalla
# tput clear
ejemplo:
echo "Este mensaje no lo veras"; tput clear; echo "Este mensaje si lo veras"

Para saber el número total de líneas que tiene tu consola actual
# tput lines

Para sabe el número total de columnas
# tput cols

Mover el cursor a una posición específica
# tput cup 15 20

Para poner un mensaje en negrita
# tput bold
ejemplo:
tput bold; echo "mensaje en negrita"

Para saber cuántos colores soporta tu consola usamos
# tput colors

Usar colores para el texto y el fondo, este me gusta bastante porque te evita tener que usar secuencias de escape ANSI.
Para poner texto de color rojo usamos
# tput setaf 1

Para poner background de color verde usamos
# tput setab 2

Les dejo 2 scripts para que vean la lista de colores básicos 🙂
for i in `seq 1 7`; do tput setaf $i; echo "Este es el color $i"; done

for i in `seq 1 7`; do tput setab $i; echo "Este es el color $i"; done

Si quieres usar más colores entonces vas a tener que especificarlo ejecutando
export TERM=xterm-256color ; reset

Si vuelves a ejecutar tput verás que ahora ya tienes soporte para 256 colores
# tput colors

Hint: cambia el script que puse arriba y en vez de 7 ponle 255 para que tengas toda la lista de colores

Si quieren ocultar el cursor pueden ejecutar
# tput civis

Para volver el cursor a su estado normal
# tput cnorm

AHora veremos unas funciones de formato, si por algún motivo quieren quitar el formato
# tput sgr0

Un reseteo general de toda la consola se hace con reset
# tput reset

Para subrayar texto
# tput smul

Para quitar subrayado
# tput rmul
ejemplo
tput smul; echo "texto subrayado"; tput rmul

Para hacer que el texto tintilee (blink)
# tput blink
ejemplo
tput blink; echo "blink blink blink"

No se olviden de # tput sgr0 para quitar el blink

Finalmente les dejo el enlace con algunos scripts de ejemplo hechos en bash

https://github.com/cvillegas/bash

Espero que les sea de utilidad 🙂

Howto: Como cambiar el timezone en RedHat/Centos/Fedora Linux

Los 2 métodos mas comunes son:

a) Usando la herramienta system-config-date
Lo cual te obliga a instalar una serie de dependencias que finalmente no tienen mayor utilidad en tu servidor

b) Editando manualmente la configuración
– Entra como root al sistema
– Edita el contenido del archivo /etc/sysconfig/clock
por ejemplo en mi caso los valores correctos serí­an
America/Lima
UTC=False

Recuerden que UTC y GMT son lo mismo, asi que a menos que quieran sincronizar con el Meridiano de Greenwich deberí­an tener este valor en False.
– Ahora hacemos que nuestro sistema identifique nuestro timezone de forma correcta
/usr/sbin/tzdata-update
– Actualizar la hora en el sistema con el comando
lo puede hacer manualmente con date o mucho mejor aún con ntp
/usr/sbin/ntpdate -b clock.redhat.com
Obvio que pueden cambiar clock.redhat.com por el servidor ntp de su preferencia 🙂

Espero les sea útil.

10 aniversario de Gentoo Linux

Revisando el blog de Daniel Robbins (el creador de Gentoo) me entero que mi distribución favorita tiene 10 años de existencia!! Precisamente Daniel hace una recopilación de los eventos ocurridos en el nacimiento de esta distribución para tratar de encontrar el momento exacto en que deberí­a considerarse como el aniversario de Gentoo.

Por lo visto aún no hay un dí­a exacto pero la fecha tiene que ser en última parte del año si consideramos la linea de tiempo que Daniel puso en el post:

http://blog.funtoo.org/2009/06/10th-anniversary-of-gentoo.html

Se esta discutiendo mucho y por lo visto la fecha va a ser el 4 de Octubre que fué la fecha en que el dominio gentoo.org fué registrado. Asi que ya saben todos los fieles usuarios de Gentoo, tenemos motivos para celebrar por nuestra magní­fica distro.

BSD is dead

Es una broma recurrente entre gente que usa *nix decir BSD is dead en alusión a el bajo porcentaje de uso que tiene esta familia de sistemas operativos que son bastante parecidos a Linux.

Particularmente yo prefiero Linux en vez de *BSD, pero hay gente que prefiere BSD sobre Linux y esto genera intensas flamewars. Yo creo que ambos son excelentes SOs para servidores, cada uno tiene sus pros y contras pero en general ambos pueden hacer lo mismo.

El video que presento a continuación se llama BSD is still Dying y es la continuación de uno denominado BSD is dying donde se cuenta un poco que es BSD, sus orí­genes, quiénes lo usan y que esta pasando con su comunidad, es una excelente charla dada por Jason Dixon en la conferencia DCBSDCon2009

Y si quieren ver la antigua charla que es casi igual visiten:
BSD is Dying

Divertidos trucos para hacer en tu consola linux

El otro dí­a estuve haciendo una “limpieza” de diskettes y CDs que tení­a guardados y me pasé mucho rato revisando los contenidos para ver si tení­a algo que valiera la pena rescatar antes de tirar todo a la basura, y asi fué como encontré una venerable carpeta llamada console_fun donde tení­a algunos scripts que hací­an tonterí­as y que ahora comparto con Uds.

Los pueden usar de 2 formas, o se crean un archivo y le pegan el contenido para luego ejecutarlo o simplemente lo escriben directamente en sus consolas

Casi todos se pueden cortar con CTRL-C

1) Efecto Matrix

tr -c "[:digit:]" " " < /dev/urandom | dd cbs=$COLUMNS conv=unblock | GREP_COLOR="1;32" grep --color "[^ ]"

2) Efecto Matrix 2
echo -e "\e[31m"; while $t; do for i in `seq 1 30`;do r="$[($RANDOM % 2)]";h="$[($RANDOM % 4)]";if [ $h -eq 1 ]; then v="\e[1m $r";else v="\e[2m $r";fi;v2="$v2 $v";done;echo -e $v2;v2="";done;

3) Ver StarWars desde la consola
telnet towel.blinkenlights.nl

4) Ver escala de grises
yes "$(seq 232 255;seq 254 -1 233)" |
while read i; do printf "\x1b[48;5;${i}m\n"; sleep .01; done

Hay otros mas pero ya son un poco nerds o son mas trucos para Linux que quizás deberí­a publicar en otro post.

Enjoy 🙂

Cuidado con las fork bombs como
:(){ :|:& };: