Я собрал Alpine Linux в Docker-контейнере со следующим Dockerfile:
FROM alpine:3.2
RUN apk add --update jq curl && rm -rf /var/cache/apk/*
сборка прошла успешно:
$ 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
в любом случае, когда я бегу, date -d
это не удается
$ 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'
в то время как остальные параметры работают нормально:
/ # 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
команду, поддерживающую контрольные даты с «сейчас», «вчера» и т. Д. Или другими нестандартными расширениями.Ответы:
Версия даты BusyBox / Alpine не поддерживает
-d
параметры, даже если справка точно такая же в версии Ubuntu, как и в других более толстых дистрибутивах.Также «контейнеризация» здесь ничего не пропускает.
Для работы с
-d
опциями вам просто нужно добавитьcoreutils
пакет:Размер изображения увеличится вдвое, но до 11,47 МБ, что на порядок меньше по сравнению со стандартом Debian:
Спасибо Энди Шинну: https://github.com/gliderlabs/docker-alpine/issues/40#issuecomment-107122371
И Кристоферу Хорреллу: https://github.com/docker-library/official-images/issues/771#issuecomment-107101595
источник
Я предполагаю, что
date
вы можете запустить в этом контейнере не дату GNU coreutils, которая обычно доступна на хостах Linux, а один из апплетов Busybox . Попробуйте получить справочные сообщения от них обоих.BusyBox предлагает множество апплетов для стандартных команд Posix с одним сжатым двоичным файлом, но большинство из них имеет очень ограниченные функции в обмен на его сохраненный размер (например, сравните выходные данные
find --help
илиtar --help
в обеих средах). Часто случается, что сценарий, который успешно выполняется в среде разработки / хоста, вообще не работает в среде контейнера / цели с BusyBox.источник
busybox
date
поддерживает-D
вариант , который (какzsh
«s ,strftime
но в отличие от GNUdate
) дает вам интерфейс ,strptime()
где вы можете разобрать даты (хотя и не относительные даты) в любом формате (аст-открытымdate
иksh93
» ыprintf
также способы настройки формата ввода).Где
busybox
построено против реализации библиотеки C, чейstrptime()
иstrftime()
поддерживает нестандартный%s
флаг, вы можете сделать:В библиотеке musl C, которую использует Alpine Linux,
strftime()
она поддерживает,%s
ноstrptime()
не поддерживает . Это нормально, хотя, как busyboxdate
, как GNUdate
поддерживает@epochtime
спецификацию даты, так что вы можете сделать:Что даст вам дату 86400 секунд назад, без двусмысленности GNU
date
«syesterday
(это 86400 назад, или это вчера в то же время дня? Что делать , если не было такого времени дня вчера , потому что часы изменились для DST?).Этот синтаксис также должен работать с GNU
date
.С ast-open
date
(или ksh93printf '%(%c)T'
) вы бы использовали:вместо.
Обратите внимание, что если вы хотите сообщить время по Гринвичу (Зулу), вы должны использовать
TZ=UTC0 date
илиdate -u
как- либо иначе, вы получите время в часовом поясе системы / пользователя.источник