私は 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
BusyBox/Alpineバージョンの日付は、Ubuntuバージョンと他のより太いディストリビューションでヘルプがまったく同じであっても、-d
オプションをサポートしていません。
また、「コンテナ化」はここで何も見逃しません。
-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
busybox
date
は_-D
_オプションをサポートします(zsh
のstrftime
と同様ですが、GNU date
)はstrptime()
へのインターフェイスを提供します。ここで、日付(相対日付ではありません)を任意の形式で解析できます(開いたdate
および_ksh93
_のprintf
には、入力形式をカスタマイズする方法もあります)。
busybox
がstrptime()
およびstrftime()
が非標準の_%s
_フラグをサポートするCライブラリ実装に対してビルドされている場合、次のようにすることができます。
_date -D %s -d "$(($(date +%s) - 86400))"
_
ただし、Alpine Linuxが使用するmusl Cライブラリでは、strftime()
は_%s
_をサポートしていますが、strptime()
はサポートしていません。 GNU date
のように、busybox date
は_@epochtime
_日付指定をサポートしているため、次のようにできます。
_date -d "@$(($(date +%s) - 86400))"
_
これは、86400秒前の日付を、GNU date
's yesterday
のあいまいさなしに与えます(86400年前か、それとも昨日同時に今日の時刻ですか?昨日、DSTのクロックが変更されたため、昨日の時刻がなかった場合はどうなりますか?)。
この構文はGNU date
でも機能します。
Ast-openのdate
(またはksh93のprintf '%(%c)T'
)を使用すると、次のようになります。
_date -d "#$(($(date +%s) - 86400))"
_
代わりに。
UTC(Zulu)時間を報告する場合は、_TZ=UTC0 date
_または_date -u
_を使用する必要があります。それ以外の場合は、システム/ユーザーのタイムゾーンで時間を取得します。
そのコンテナで実行できるdate
は、Linuxホストで一般的に利用できる GNU coreutils 日付ではなく、 Busybox アプレットの1つだと思います。両方からヘルプメッセージを取得するようにしてください。
# 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のコンテナー/ターゲット環境でまったく機能しないことがよくあります。