Ich habe Alpine Linux in einem Docker-Container mit der folgenden Docker- Datei erstellt:
FROM alpine:3.2
RUN apk add --update jq curl && rm -rf /var/cache/apk/*
Der Build wurde erfolgreich ausgeführt:
$ 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
Wenn ich date -d
es starte, schlägt es trotzdem fehl:
$ 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'
während der Rest der Optionen in Ordnung zu sein scheint:
/ # 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
Befehl, der Referenzdaten mit "jetzt", "gestern" usw. oder anderen nicht standardmäßigen Erweiterungen unterstützt.Antworten:
Die BusyBox / Alpine-Version des Datums unterstützt keine
-d
Optionen, auch wenn die Hilfe in der Ubuntu-Version sowie in anderen fetteren Distributionen genau gleich ist.Auch der "Containerisierung" fehlt hier nichts.
Um mit
-d
Optionen zu arbeiten , müssen Sie nur dascoreutils
Paket hinzufügen :Die Bildgröße wird sich verdoppeln, beträgt jedoch bis zu 11,47 MB, mehr als eine Größenordnung weniger als im Debian-Standard:
Vielen Dank an Andy Shinn: https://github.com/gliderlabs/docker-alpine/issues/40#issuecomment-107122371
Und an Christopher Horrell: https://github.com/docker-library/official-images/issues/771#issuecomment-107101595
quelle
Ich nehme an, das, was
date
Sie in diesem Container ausführen können, ist nicht das Datum von GNU coreutils, das üblicherweise auf Linux-Hosts verfügbar ist, sondern eines der Busybox- Applets. Versuchen Sie, Hilfemeldungen von beiden zu erhalten.BusyBox bietet viele Applets für Posix-Standardbefehle mit einfachem Crunched Binary, aber die meisten von ihnen haben im Austausch für die gespeicherte Größe sehr eingeschränkte Funktionen (vergleichen Sie beispielsweise die Ausgaben von
find --help
odertar --help
in beiden Umgebungen). Es kommt häufig vor, dass ein Skript, das in der Entwicklungs- / Hostumgebung erfolgreich ausgeführt wird, in der Container- / Zielumgebung mit BusyBox überhaupt nicht funktioniert.quelle
busybox
date
unterstützt eine-D
Option, die Ihnen (wiezsh
's,strftime
aber im Gegensatz zu GNUdate
) eine Schnittstelle bietet,strptime()
über die Sie Datumsangaben (wenn auch keine relativen Datumsangaben) in einem beliebigen Format analysieren können (ast-opendate
undksh93
' sprintf
haben auch Möglichkeiten, das Eingabeformat anzupassen).Wo
busybox
wird gegen eine C-Bibliotheksimplementierung erstellt, derenstrptime()
undstrftime()
das nicht standardmäßige%s
Flag unterstützt, können Sie Folgendes tun:In der musl C-Bibliothek, die alpine Linux verwendet, wird dies
strftime()
jedoch unterstützt%s
,strptime()
jedoch nicht. Als Busyboxdate
ist es in Ordnung , da GNUdate
die Datumsspezifikation unterstützt@epochtime
, sodass Sie Folgendes tun können:Welche Ihnen das Datum 86400 Sekunden geben, ohne die Mehrdeutigkeiten des GNU
date
‚syesterday
(ist es vor 86400, oder ist es gestern zur gleichen Zeit des Tages? Was , wenn es keine solche Zeit des Tages gestern , weil die Uhr geändert für die Sommerzeit?).Diese Syntax sollte auch mit GNU funktionieren
date
.Mit ast-open's
date
(oder ksh93'sprintf '%(%c)T'
) würden Sie verwenden:stattdessen.
Beachten Sie, dass , wenn Sie UTC (Zulu) Zeit zu melden, sollten Sie verwenden
TZ=UTC0 date
oderdate -u
wie sonst, würden Sie die Zeit , in der System / Benutzers Zeitzone erhalten.quelle