Perintah "date -d" gagal pada wadah Docker Alpine Linux

9

Saya membangun Alpine Linux dalam wadah Docker dengan Dockerfile berikut:

FROM alpine:3.2
RUN apk add --update jq curl && rm -rf /var/cache/apk/*

build run berhasil:

$ 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

Lagi pula ketika saya menjalankannya date -dgagal:

$ 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'

sementara sisa opsi tampaknya berjalan ok:

/ # date 
Sat May 30 18:57:24 UTC 2015
/ # date +"%A"
Saturday
/ # date +"%Y-%m-%dT%H:%M:%SZ"
2015-05-30T19:00:38Z
BBJ3
sumber
Jangan mengandalkan dateperintah yang mendukung tanggal referensi dengan "sekarang", "kemarin", dll., Atau ekstensi non-standar lainnya.
Janis

Jawaban:

26

Versi BusyBox / Alpine tanggal tidak mendukung -dopsi, bahkan jika bantuannya sama persis di versi Ubuntu dan juga di distro lain yang lebih gemuk.

Juga "kontainerisasi" tidak ketinggalan apa pun di sini.

Untuk bekerja dengan -dopsi, Anda hanya perlu menambahkan coreutilspaket:

$ cat Dockerfile.alpine-coreutils
FROM alpine:3.2
RUN apk add --update coreutils && rm -rf /var/cache/apk/*


$ docker build -t alpine-coreutils - <  Dockerfile.alpine-coreutils
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 coreutils && rm -rf /var/cache/apk/*
 ---> Running in 694fa5cb271c
fetch http://dl-4.alpinelinux.org/alpine/v3.2/main/x86_64/APKINDEX.tar.gz
(1/3) Installing libattr (2.4.47-r3)
(2/3) Installing libacl (2.2.52-r2)
(3/3) Installing coreutils (8.23-r0)
Executing busybox-1.23.2-r0.trigger
OK: 12 MiB in 18 packages
 ---> a7d9116a00ee
Removing intermediate container 694fa5cb271c
Successfully built a7d9116a00ee


$ docker run -i -t alpine-coreutils sh
/ # date -d last-week
Sun May 24 09:19:34 UTC 2015
/ # date -d yesterday 
Sat May 30 09:19:46 UTC 2015
/ # date 
Sun May 31 09:19:50 UTC 2015

Ukuran gambar akan berlipat ganda tetapi hingga 11,47 MB, lebih dari satu urutan siZe lebih sedikit, dibandingkan dengan standar Debian:

$ docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
alpine-coreutils           latest              a7d9116a00ee        2 minutes ago       11.47 MB
alpine                     3.2                 8697b6cc1f48        2 days ago          5.242 MB
debian                     latest              df2a0347c9d0        11 days ago         125.2 MB

Terima kasih kepada Andy Shinn: https://github.com/gliderlabs/docker-alpine/issues/40#issuecomment-107122371

Dan kepada Christopher Horrell: https://github.com/docker-library/official-images/issues/771#issuecomment-107101595

BBJ3
sumber
1

Saya kira dateAnda dapat menjalankan dalam wadah itu bukan tanggal GNU coreutils yang umumnya tersedia di host Linux, tetapi salah satu applet Busybox . Cobalah untuk mendapatkan pesan bantuan dari keduanya.

# date --help
BusyBox v1.22.1 (Ubuntu 1:1.22.0-9ubuntu1) multi-call binary.

Usage: date [OPTIONS] [+FMT] [TIME]

Display time (using +FMT), or set time

    [-s,--set] TIME Set time to TIME
    -u,--utc    Work in UTC (don't convert to local time)
    -R,--rfc-2822   Output RFC-2822 compliant date string
    -I[SPEC]    Output ISO-8601 compliant date string
            SPEC='date' (default) for date only,
            'hours', 'minutes', or 'seconds' for date and
            time to the indicated precision
    -r,--reference FILE Display last modification time of FILE
    -d,--date TIME  Display TIME, not 'now'
    -D FMT      Use FMT for -d TIME conversion

Recognized TIME formats:
    hh:mm[:ss]
    [YYYY.]MM.DD-hh:mm[:ss]
    YYYY-MM-DD hh:mm[:ss]
    [[[[[YY]YY]MM]DD]hh]mm[.ss]
    'date TIME' form accepts MMDDhhmm[[YY]YY][.ss] instead

BusyBox menawarkan banyak applet untuk perintah standar Posix dengan biner tunggal, tetapi kebanyakan dari mereka memiliki fungsi yang sangat terbatas dalam pertukaran untuk ukurannya yang disimpan (bandingkan keluaran find --helpatau tar --helpdi kedua lingkungan misalnya). Sering terjadi bahwa skrip yang berjalan dengan sukses di lingkungan pengembangan / host tidak berfungsi sama sekali di lingkungan wadah / target dengan BusyBox.

yaegashi
sumber
1

busybox datemendukung sebuah -Dopsi yang (seperti zsh's strftimetetapi bertentangan dengan GNU date) memberikan Anda sebuah antarmuka untuk strptime()di mana Anda dapat mengurai tanggal (meskipun tidak tanggal relatif) dalam format apapun (ast-terbuka datedan ksh93' sprintf juga memiliki cara untuk menyesuaikan format input).

Di mana busyboxdibangun melawan implementasi C library yang strptime()dan strftime()mendukung %sflag non-standar , Anda dapat melakukan:

date -D %s -d "$(($(date +%s) - 86400))"

Di pustaka C musl yang menggunakan Linux meskipun, strftime()tidak mendukung %stetapi strptime()tidak. Tidak apa-apa meskipun sebagai busybox date, seperti GNU datemendukung @epochtimespesifikasi tanggal, sehingga Anda dapat melakukannya:

date -d "@$(($(date +%s) - 86400))"

Yang akan memberi Anda tanggal 86400 detik yang lalu, tanpa ambiguitas GNU date's yesterday(itu 86400 lalu, atau kemarin pada waktu yang sama hari? Bagaimana jika tidak ada waktu seperti hari kemarin karena jam berubah untuk DST?).

Sintaks itu juga harus bekerja dengan GNU date.

Dengan ast-open's date(atau ksh93's printf '%(%c)T'), Anda akan menggunakan:

date -d "#$(($(date +%s) - 86400))"

sebagai gantinya.

Perhatikan bahwa jika Anda ingin melaporkan waktu UTC (Zulu), Anda harus menggunakan TZ=UTC0 dateatau date -usebaliknya, Anda akan mendapatkan waktu di zona waktu sistem / pengguna.

Stéphane Chazelas
sumber