Instalar Crystal en Docker: cómo añadir el repositorio de Crystal a Docker en el Dockerfile

Dockerfile (extracto)

ENV APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=No avisar
Ejecutar apt-get update && apt-get install -y \N -
         software-properties-common \ ~ -
         construir-esencial \ ~ -
         libevent-dev \N - en inglés
         libssl-dev \N - en inglés
         libxml2-dev \ ~ -
         libyaml-dev \N - en inglés
         libgmp-dev \ ~ -
         libreadline-dev \N - para los que no tienen acceso a la información.
         apt-transport-https \N - apt-transport-https
         iputils-ping \N - para la búsqueda de información
         git \ ~ - git \ ~ -
         aptitud \ ~ -
         nano \N - en el caso de la industria de la construcción.
         openssh-servidor \ ~ -
         && apt-key adv -keyserver keys.gnupg.net -recv-keys 09617FD37CC06B54 \N -y
         && add-apt-repository 'deb https://dist.crystal-lang.org/apt cristal principal' \ ~ -
         && apt-get update \N -
         && apt-get install -y crystal \N - y
         && rm -rf /var/lib/apt/lists/* \N - rm -rf
         && mkdir /root/.ssh

El ENV APT_KEY_DONT_WARN_ON_DANGEROUSE_USAGE es necesario para que apt-key adv no se ahogue al no ser ejecutado desde una terminal.

Para añadir el repositorio Crystal, es necesario instalar la clave

W: Error de GPG: https://dist.crystal-lang.org/apt cristal InRelease: Las siguientes firmas no han podido ser verificadas porque la clave pública no está disponible: NO_PUBKEY 09617FD37CC06B54
E: El repositorio 'https://dist.crystal-lang.org/apt crystal InRelease' no está firmado.

Cuando añada la llave utilizando un Dockerfile, puede que reciba el siguiente mensaje de error:

Ejecutando: /tmp/apt-key-gpghome.daecBAEPSJ/gpg.1.sh -keyserver keys.gnupg.net -recv-keys 09617FD37CC06B54
gpg: la recepción del servidor de claves ha fallado: No se puede asignar la dirección solicitada

Esto se debe a que gpg no puede enlazar con una dirección IPv6. Por lo tanto, tiene que

habilitar el soporte de IPv6 en su host para Docker:

editar / crear /etc/docker/daemon.json

{
  "ipv6": true,
  "fixed-cidr-v6": "2001:db8:1::/64"
}

Y reinicie el servicio Docker:

servicio docker restart


el fixed-cidr-v6 es NO opcional como https://docs.docker.com/config/daemon/ipv6/ podría hacerles creer.

prueba de compatibilidad con IPv6:

docker run -it alpine ash -c "ip -6 addr show dev eth0; ip -6 route show"
si no devuelve nada, entonces ipv6 NO está habilitado
muestra de salida con IPv6 activado:

max@morpheus:~/docker$ docker run -it alpine ash -c "ip -6 addr show dev eth0; ip -6 route show"
163: eth0@if164: mtu 1500 state UP
     inet6 2001:db8:1::242:ac11:2/64 scope global flags 02
        valid_lft forever preferred_lft forever
     inet6 fe80::42:acff:fe11:2/64 scope link tentativo
        valid_lft forever preferred_lft forever
2001:db8:1::/64 dev eth0 métrica 256
fe80::/64 dev eth0 metric 256
default via 2001:db8:1::1 dev eth0 metric 1024
ff00::/8 dev eth0 métrica 256



No se ha podido iniciar el motor de contenedores de aplicaciones Docker.

tail -n 50 /var/log/syslog

Jan 11 21:39:35 morpheus dockerd[697]: time="2019-01-11T21:39:35.770500563+01:00″ level=warning msg="Su kernel no soporta el límite de memoria swap"
Jan 11 21:39:35 morpheus dockerd[697]: time="2019-01-11T21:39:35.770617796+01:00″ level=warning msg="Su kernel no soporta cgroup rt period"
Jan 11 21:39:35 morpheus dockerd[697]: time="2019-01-11T21:39:35.770656361+01:00″ level=warning msg="Su kernel no soporta cgroup rt runtime"

Jan 11 21:39:40 morpheus dockerd[697]: time="2019-01-11T21:39:40.800355314+01:00″ level=info msg="El puente por defecto (docker0) está asignado con una dirección IP 172.17.0.0/16. La opción -bip del demonio se puede utilizar para establecer una dirección IP preferida"

11 de enero 21:39:40 morpheus dockerd[697]: Error al iniciar el demonio: Error al inicializar el controlador de red: Error al crear la red "puente" por defecto: no se ha podido encontrar un conjunto de direcciones IPv6 disponibles y no solapadas entre las predeterminadas para asignar a la red

Si el demonio Docker no se inicia, mira en /var/log/syslog para encontrar la razón.

Aquí probablemente significa que no ha añadido el fixed-cidr-v6 como he indicado más arriba. Docker, desde hace un par de versiones, parece requerir esto. Hay un tema en GitHub al respecto.

y todo esto por ...

imagen

Referencias

https://github.com/inversepath/usbarmory-debian-base_image/issues/9

https://docs.docker.com/v17.09/engine/userguide/networking/default_network/ipv6/

https://github.com/moby/moby/issues/36954