Construí Alpine Linux en un contenedor Docker con el siguiente Dockerfile:
FROM alpine:3.2
RUN apk add --update jq curl && rm -rf /var/cache/apk/*
la compilación se ejecutó correctamente:
$ docker build -t collector .
Sending build context to Docker daemon 2.048 kB
Sending build context to Docker daemon
Step 0 : FROM alpine:3.2
3.2: Pulling from alpine
8697b6cc1f48: Already exists
alpine:3.2: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
Digest: sha256:eb84cc74347e4d7c484d566dec8a5eef82bab1b78308b92cda559bcff29c27cc
Status: Downloaded newer image for alpine:3.2
---> 8697b6cc1f48
Step 1 : RUN apk add --update jq curl && rm -rf /var/cache/apk/*
---> Running in 888571296e79
fetch http://dl-4.alpinelinux.org/alpine/v3.2/main/x86_64/APKINDEX.tar.gz
(1/11) Installing run-parts (4.4-r0)
(2/11) Installing openssl (1.0.2a-r1)
(3/11) Installing lua5.2-libs (5.2.4-r0)
(4/11) Installing lua5.2 (5.2.4-r0)
(5/11) Installing ncurses-terminfo-base (5.9-r3)
(6/11) Installing ncurses-widec-libs (5.9-r3)
(7/11) Installing lua5.2-posix (33.3.1-r2)
(8/11) Installing ca-certificates (20141019-r2)
(9/11) Installing libssh2 (1.5.0-r0)
(10/11) Installing curl (7.42.1-r0)
(11/11) Installing jq (1.4-r0)
Executing busybox-1.23.2-r0.trigger
Executing ca-certificates-20141019-r2.trigger
OK: 9 MiB in 26 packages
---> 7625779b773d
Removing intermediate container 888571296e79
Successfully built 7625779b773d
de todos modos cuando lo ejecuto date -d
falla:
$ docker run -i -t collector sh
/ # date -d yesterday
date: invalid date 'yesterday'
/ # date -d now
date: invalid date 'now'
/ # date -d next-month
date: invalid date 'next-month'
mientras que el resto de las opciones parecen funcionar bien:
/ # date
Sat May 30 18:57:24 UTC 2015
/ # date +"%A"
Saturday
/ # date +"%Y-%m-%dT%H:%M:%SZ"
2015-05-30T19:00:38Z
date
comando que admite fechas de referencia con "ahora", "ayer", etc. u otras extensiones no estándar.Respuestas:
La versión de fecha de BusyBox / Alpine no admite
-d
opciones, incluso si la ayuda es exactamente la misma en la versión de Ubuntu, así como en otras distribuciones más gordas.Además, la "contenedorización" no pierde nada aquí.
Para trabajar con
-d
opciones solo necesita agregar elcoreutils
paquete:El tamaño de la imagen se duplicará pero es de hasta 11.47 MB, más de un orden de tamaño menor, en comparación con el estándar Debian:
Gracias a Andy Shinn: https://github.com/gliderlabs/docker-alpine/issues/40#issuecomment-107122371
Y a Christopher Horrell: https://github.com/docker-library/official-images/issues/771#issuecomment-107101595
fuente
Supongo que lo
date
que puede ejecutar en ese contenedor no es la fecha de GNU coreutils, que está comúnmente disponible en hosts Linux, sino uno de los applets de Busybox . Intenta recibir mensajes de ayuda de ambos.BusyBox ofrece muchos applets para comandos estándar de Posix con un solo binario cruzado, pero la mayoría de ellos tiene funciones muy restringidas a cambio de su tamaño guardado (compare las salidas de
find --help
tar --help
por ejemplo, o en ambos entornos). Con frecuencia sucede que un script que se ejecuta con éxito en el entorno de desarrollo / host no funciona en absoluto en el entorno de contenedor / destino con BusyBox.fuente
busybox
date
admite una-D
opción que (comozsh
'sstrftime
pero contrario a GNUdate
) le brinda una interfaz parastrptime()
analizar fechas (aunque no fechas relativas) en cualquier formato (ast-opendate
yksh93
' sprintf
también tienen formas de personalizar el formato de entrada).Cuando
busybox
se construye contra una implementación de la biblioteca C cuyastrptime()
ystrftime()
apoyar la no-estándar de%s
bandera, que podría hacer:Sin embargo, en la biblioteca musl C que alpine Linux usa,
strftime()
admite%s
perostrptime()
no. Sin embargo, está bien como busyboxdate
, como GNUdate
admite la@epochtime
especificación de fecha, por lo que puede hacer:Que le dará la fecha de hace 86.400 segundos, sin la ambigüedad de GNU
date
s'yesterday
(es que hace 86400, o se trata de ayer a la misma hora del día? ¿Qué pasa si no había tal hora del día de ayer debido a que el reloj ha cambiado para el horario de verano?).Esa sintaxis también debería funcionar con GNU
date
.Con ast-open's
date
(o ksh93'sprintf '%(%c)T'
), usarías :en lugar.
Tenga en cuenta que si desea informar la hora UTC (Zulu), debe usar
TZ=UTC0 date
odate -u
, de lo contrario, obtendrá la hora en la zona horaria del sistema / usuario.fuente