Docker Alpine Linux 컨테이너에서 "date -d" 명령이 실패함

Docker Alpine Linux 컨테이너에서 "date -d" 명령이 실패함

내가 지 었지알파인 리눅스안에도커 컨테이너다음 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

답변1

BusyBox/Alpine 버전의 날짜는 -d도움말이 Ubuntu 버전 및 기타 더 큰 배포판에서 정확히 동일하더라도 옵션을 지원하지 않습니다.

게다가 "컨테이너화"는 아무것도 남기지 않습니다.

-d옵션을 사용하려면 coreutils패키지를 추가하기만 하면 됩니다.

$ 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

데비안 표준에 비해 이미지 크기는 두 배가 되지만 11.47MB까지는 크기가 한 단계 더 작습니다.

$ 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

Andy Zinn에게 감사드립니다: https://github.com/gliderlabs/docker-alpine/issues/40#issuecomment-107122371

크리스토퍼 호렐:https://github.com/docker-library/official-images/issues/771#issuecomment-107101595

답변2

busybox date( 's -D와 유사 하지만 GNU 와는 반대 ) 모든 형식(상대 날짜는 아니지만)으로 날짜를 구문 분석할 수 있는 인터페이스를 제공 하는 옵션을 지원합니다 (ast-open 및 's 에는 사용자 정의 입력 형식 메서드도 있음).zshstrftimedatestrptime()dateksh93printf

busybox가 C 라이브러리 구현에 대해 구축되고 strptime()비표준 strftime()플래그를 지원하는 경우 %s다음을 수행할 수 있습니다.

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

그러나 알파인 리눅스에서 사용하는 musl C 라이브러리에서는 strftime()이를 지원 %s하지만 strptime()지원하지 않습니다. 그러나 dateGNU는 날짜 사양을 date지원하므로 비지박스는 중요하지 않으므로 @epochtime다음과 같이 할 수 있습니다.

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

이것은 GNU의 모호함 없이 86400초 전의 날짜를 제공합니다 date( yesterday86400초 전이었습니까, 아니면 어제 같은 시간이었습니까? 시계가 바뀌어서 어제 그런 시간이 없었다면 어떨까요? 일광 절약 시간제입니까?).

이 구문은 GNU에서도 작동합니다 date.

ast-open date(또는 ksh93 printf '%(%c)T')을 사용하면 다음을 사용할 수 있습니다.

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

대신에.

UTC(Zulu) 시간을 보고하려면 UTC(Zulu) 시간을 사용해야 합니다. TZ=UTC0 date그렇지 않으면 date -u시스템/사용자 시간대로 시간이 표시됩니다.

답변3

편집: 이 명령을 Alpine:3.2에서 테스트했습니다.

현재 날짜에서 24시간을 빼려면 다음을 실행하세요.

# date
Fri Jul 10 13:08:56 UTC 2020

# date -d "-24:00:00"
Thu Jul  9 00:00:00 UTC 2020

다음을 사용하여 현재 날짜에 추가할 수도 있습니다.

# date -d "+24:00:00"
Sat Jul 11 00:00:00 UTC 2020

도움이 되었기를 바랍니다

답변4

시간대 변환이 필요한 경우 coreutils이것만으로는 충분하지 않습니다.
당신도 그것 이 필요 합니다 tzdata.

이와 같은 명령은 TZ='America/Los_Angeles' date효과가 없으며 TZvar는 무시됩니다.
그 후에 시간대 변환이 제대로 작동하기 시작합니다 .apk add tzdata

관련 정보