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 -d
gagal:
$ 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
date
perintah yang mendukung tanggal referensi dengan "sekarang", "kemarin", dll., Atau ekstensi non-standar lainnya.Jawaban:
Versi BusyBox / Alpine tanggal tidak mendukung
-d
opsi, 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
-d
opsi, Anda hanya perlu menambahkancoreutils
paket:Ukuran gambar akan berlipat ganda tetapi hingga 11,47 MB, lebih dari satu urutan siZe lebih sedikit, dibandingkan dengan standar Debian:
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
sumber
Saya kira
date
Anda 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.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 --help
atautar --help
di 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.sumber
busybox
date
mendukung sebuah-D
opsi yang (sepertizsh
'sstrftime
tetapi bertentangan dengan GNUdate
) memberikan Anda sebuah antarmuka untukstrptime()
di mana Anda dapat mengurai tanggal (meskipun tidak tanggal relatif) dalam format apapun (ast-terbukadate
danksh93
' sprintf
juga memiliki cara untuk menyesuaikan format input).Di mana
busybox
dibangun melawan implementasi C library yangstrptime()
danstrftime()
mendukung%s
flag non-standar , Anda dapat melakukan:Di pustaka C musl yang menggunakan Linux meskipun,
strftime()
tidak mendukung%s
tetapistrptime()
tidak. Tidak apa-apa meskipun sebagai busyboxdate
, seperti GNUdate
mendukung@epochtime
spesifikasi tanggal, sehingga Anda dapat melakukannya:Yang akan memberi Anda tanggal 86400 detik yang lalu, tanpa ambiguitas GNU
date
'syesterday
(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'sprintf '%(%c)T'
), Anda akan menggunakan:sebagai gantinya.
Perhatikan bahwa jika Anda ingin melaporkan waktu UTC (Zulu), Anda harus menggunakan
TZ=UTC0 date
ataudate -u
sebaliknya, Anda akan mendapatkan waktu di zona waktu sistem / pengguna.sumber