Eu construí Alpine Linux em um recipiente Docker com o seguinte Dockerfile:
FROM alpine:3.2
RUN apk add --update jq curl && rm -rf /var/cache/apk/*
a construção foi executada com sucesso:
$ 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 qualquer maneira, quando eu corro date -d
, falha:
$ 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'
enquanto o restante das opções parece estar funcionando bem:
/ # 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
comando que suporta datas de referência com "agora", "ontem" etc. etc. ou outras extensões não padrão.Respostas:
A versão de data do BusyBox / Alpine não suporta
-d
opções, mesmo que a ajuda seja exatamente a mesma na versão do Ubuntu e em outras distribuições mais gordas.Além disso, a "contêinerização" não perde nada aqui.
Para trabalhar com
-d
opções, você só precisa adicionar ocoreutils
pacote:O tamanho da imagem dobrará, mas é de até 11,47 MB, mais do que uma ordem de tamanho menor, comparado ao padrão Debian:
Agradecimentos a Andy Shinn: https://github.com/gliderlabs/docker-alpine/issues/40#issuecomment-107122371
E para Christopher Horrell: https://github.com/docker-library/official-images/issues/771#issuecomment-107101595
fonte
Suponho que
date
você possa executar nesse contêiner não seja a data do coreutils GNU, que normalmente está disponível nos hosts Linux, mas um dos applets do Busybox . Tente receber mensagens de ajuda de ambos.O BusyBox oferece muitos applets para comandos padrão do Posix com um único binário triturado, mas a maioria deles possui funções muito restritas em troca do tamanho salvo (compare as saídas de
find --help
outar --help
nos dois ambientes, por exemplo). Freqüentemente acontece que um script executado com êxito no ambiente de desenvolvimento / host não funciona no ambiente de contêiner / destino com o BusyBox.fonte
busybox
date
suporta uma-D
opção que (comozsh
'sstrftime
, mas ao contrário do GNUdate
) dá-lhe uma interface parastrptime()
onde você pode analisar datas (embora não datas relativas) em qualquer formato (ast-abertodate
eksh93
deprintf
também têm maneiras de personalizar o formato de entrada).Onde
busybox
é construído contra uma implementação de biblioteca C cujo suportestrptime()
estrftime()
o%s
sinalizador não padrão , você pode fazer:Na biblioteca C, que o Linux alpino usa, no entanto,
strftime()
suporta,%s
masstrptime()
não. Tudo bem, embora o busyboxdate
, como o GNU,date
suporte a@epochtime
especificação de data, você possa:Que lhe dará a data de 86400 segundos atrás, sem a ambiguidade da GNU
date
'syesterday
(é 86400 atrás, ou é ontem, ao mesmo tempo do dia? E se não houve essa hora do dia ontem, porque o relógio mudou para o horário de verão?).Essa sintaxe também deve funcionar com o GNU
date
.Com ast-open's
date
(ou ksh93'sprintf '%(%c)T'
), você usaria:em vez de.
Observe que, se você deseja relatar o horário UTC (Zulu), deve usar
TZ=UTC0 date
oudate -u
, caso contrário, obterá o horário no fuso horário do sistema / usuário.fonte