Docker Alpine Linuxコンテナで「date -d」コマンドが失敗する


9

私は、構築されたアルパインLinuxの中でドッカーコンテナ以下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「今」、「昨日」などの参照日をサポートするコマンド、またはその他の非標準の拡張機能を当てにしないでください。
Janis

回答:


26

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

イメージサイズは2倍になりますが、11.47 MB​​までで、Debian標準と比較してサイズが1オーダー少なくなります。

$ 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

アンディ・シンのおかげ:https : //github.com/gliderlabs/docker-alpine/issues/40#issuecomment-107122371

そしてクリストファーホレル:https : //github.com/docker-library/official-images/issues/771#issuecomment-107101595


1

私は考えdateますが、そのコンテナ内で実行することができますがないGNU coreutilsの Linuxホスト上で一般的に利用可能である日付が、の1 Busyboxののアプレット。両方からヘルプメッセージを取得してください。

# 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は、単一のクランチバイナリを備えたPosix標準コマンド用の多くのアプレットを提供しますが、それらのほとんどは、保存サイズと引き換えに非常に制限された機能を備えています(たとえば、find --helpまたはtar --help両方の環境の出力を比較します)。開発/ホスト環境で正常に実行されるスクリプトがBusyBoxのコンテナー/ターゲット環境でまったく機能しないことがよくあります。


1

busybox date支持体は、-D(のようなオプションzshのはstrftimeしかし、GNUとは反対にdate)あなたへのインタフェース与えstrptime()任意の形式で、あなたが日付を解析できる場所(ではないが相対的な日付が)(AST-オープンdateksh93'S printfも入力フォーマットをカスタマイズする方法を持っています)。

非標準フラグをサポートbusyboxするCライブラリ実装に対してがビルドされた場所は、次のようにすることができます。strptime()strftime()%s

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

高山Linuxは、しかし、使用していますMUSLのCライブラリでstrftime()サポートしています%sが、strptime()しません。dateGNUのようにbusybox date@epochtime日付指定をサポートしているので問題ありません。

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

GNU dateの曖昧さなしに、86400秒前の日付を与えますyesterday(86400前ですか、それとも昨日の同じ時間ですか?時計が変わったために昨日のそのような時間がなかったとしたらどうでしょうか。 DSTの場合は?)

この構文はGNUでも機能するはずdateです。

ast-open's date(またはksh93's printf '%(%c)T')では、以下を使用します。

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

代わりに。

UTC(ズールー語)時間を報告する場合は、システムのユーザーのタイムゾーンで時刻を取得するTZ=UTC0 datedate -u、そうでない場合は使用する必要があることに注意してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.