J'ai construit Alpine Linux dans un conteneur Docker avec le Dockerfile suivant:
FROM alpine:3.2
RUN apk add --update jq curl && rm -rf /var/cache/apk/*
le build s'est déroulé avec succès:
$ 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 toute façon quand je l'exécute, date -d
il échoue:
$ 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'
tandis que le reste des options semblent fonctionner correctement:
/ # 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
commande qui prend en charge les dates de référence avec "maintenant", "hier", etc., ou d'autres extensions non standard.Réponses:
La version BusyBox / Alpine de la date ne prend pas en charge les
-d
options, même si l'aide est exactement la même dans la version Ubuntu ainsi que dans d'autres distributions plus grasses.De plus, la "conteneurisation" ne manque rien ici.
Pour travailler avec des
-d
options, il vous suffit d'ajouter uncoreutils
package:La taille de l'image va doubler mais est jusqu'à 11,47 Mo, plus d'un ordre de moins, par rapport au standard Debian:
Merci à Andy Shinn: https://github.com/gliderlabs/docker-alpine/issues/40#issuecomment-107122371
Et à Christopher Horrell: https://github.com/docker-library/official-images/issues/771#issuecomment-107101595
la source
Je suppose que le que
date
vous pouvez exécuter dans ce conteneur n'est pas la date de coreutils GNU qui est couramment disponible sur les hôtes Linux, mais l'une des applets Busybox . Essayez d'obtenir des messages d'aide des deux.BusyBox propose de nombreuses applets pour les commandes standard Posix avec un seul binaire croqué, mais la plupart d'entre elles ont des fonctions très restreintes en échange de sa taille enregistrée (comparer les sorties de
find --help
outar --help
dans les deux environnements par exemple). Il arrive fréquemment qu'un script qui s'exécute correctement dans l'environnement de développement / hôte ne fonctionne pas du tout dans l'environnement de conteneur / cible avec BusyBox.la source
busybox
date
prend en charge une-D
option que (commezsh
l «strftime
mais contrairement à GNUdate
) vous donne une interface àstrptime()
laquelle vous pouvez analyser les dates (mais pas de dates relatives) dans tout format (ast ouvertdate
etksh93
» sprintf
ont aussi des façons de personnaliser le format d'entrée).Où
busybox
est construit par rapport à une implémentation de bibliothèque C dontstrptime()
etstrftime()
prenant en charge l'%s
indicateur non standard , vous pouvez faire:Dans la bibliothèque musl C que Linux alpin utilise cependant,
strftime()
prend en charge%s
maisstrptime()
ne le fait pas. C'est OK mais comme busyboxdate
, comme GNUdate
prend en charge la@epochtime
spécification de date, vous pouvez donc faire:Ce qui vous donnera la date il y a 86400 secondes, sans l'ambiguïté de GNU
date
deyesterday
(est - il y a 86400, ou est - ce hier au même moment de la journée? Et s'il n'y avait pas de temps de la journée d' hier parce que l'horloge a changé pour DST?).Cette syntaxe devrait également fonctionner avec GNU
date
.Avec ast-open
date
(ou ksh93printf '%(%c)T'
), vous utiliseriez:au lieu.
Notez que si vous souhaitez signaler l'heure UTC (Zulu), vous devez utiliser
TZ=UTC0 date
oudate -u
autrement, vous obtiendrez l'heure dans le fuseau horaire du système / de l'utilisateur.la source