Ngày tháng -d lệnh Lệnh không thành công trên container Docker Alpine Linux


9

Tôi đã xây dựng Alpine Linux trong một container Docker với Dockerfile sau:

FROM alpine:3.2
RUN apk add --update jq curl && rm -rf /var/cache/apk/*

bản dựng chạy thành công:

$ 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

dù sao khi tôi chạy date -dnó không thành công:

$ 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'

trong khi các tùy chọn còn lại có vẻ chạy ổn:

/ # date 
Sat May 30 18:57:24 UTC 2015
/ # date +"%A"
Saturday
/ # date +"%Y-%m-%dT%H:%M:%SZ"
2015-05-30T19:00:38Z

Đừng tin vào datelệnh hỗ trợ ngày tham chiếu với "ngay bây giờ", "ngày hôm qua", v.v. hoặc các tiện ích mở rộng không chuẩn khác.
Janis

Câu trả lời:


26

Phiên bản ngày của BusyBox / Alpine không hỗ trợ -dcác tùy chọn, ngay cả khi sự trợ giúp hoàn toàn giống nhau trong phiên bản Ubuntu cũng như các phiên bản khác nhiều chất béo hơn.

Ngoài ra, "container hóa" không bỏ lỡ bất cứ điều gì ở đây.

Để làm việc với -dcác tùy chọn, bạn chỉ cần thêm coreutilsgói:

$ 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

Kích thước hình ảnh sẽ tăng gấp đôi nhưng chỉ còn 11,47 MB, ít hơn một đơn hàng siZe, so với tiêu chuẩn Debian:

$ 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

Cảm ơn Andy Shinn: https://github.com/gliderlabs/docker-alpine/issues/40#issuecomment-107122371

Và đến Christopher Horrell: https://github.com/docker-l Library / office-images /issues / 771 #issuecomment-107101595


1

Tôi cho rằng datebạn có thể chạy trong vùng chứa đó không phải là ngày coreutils GNU thường có trên các máy chủ Linux, mà là một trong các applet Busybox . Hãy cố gắng để nhận được tin nhắn trợ giúp từ cả hai.

# 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 cung cấp nhiều applet cho các lệnh tiêu chuẩn Posix với nhị phân giòn duy nhất, nhưng hầu hết trong số chúng có các chức năng rất hạn chế để đổi lấy kích thước đã lưu của nó ( ví dụ so sánh đầu ra của find --helphoặc tar --helptrong cả hai môi trường). Điều thường xảy ra là một tập lệnh chạy thành công trong môi trường phát triển / máy chủ hoàn toàn không hoạt động trong môi trường vùng chứa / đích với BusyBox.


1

busybox datehỗ trợ một -Dtùy chọn mà (như zsh's strftimenhưng trái với GNU date) cung cấp cho bạn một giao diện để strptime()nơi bạn có thể phân tích cú pháp ngày (mặc dù không phải ngày tương đối) trong bất kỳ định dạng (ast-mở dateksh93' s printfcũng có nhiều cách để tùy chỉnh định dạng đầu vào).

Trường hợp busyboxđược xây dựng dựa trên triển khai thư viện C có strptime()strftime()hỗ trợ %scờ không chuẩn , bạn có thể thực hiện:

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

Tuy nhiên, trong thư viện musl C mà alpine Linux sử dụng, strftime()không hỗ trợ %snhưng strptime()không. Mặc dù bận rộn datenhư GNU, như GNU datehỗ trợ @epochtimeđặc tả ngày, vì vậy bạn có thể làm:

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

Mà sẽ cung cấp cho bạn ngày 86400 giây, nếu không có sự nhập nhằng của GNU date's yesterday(là nó 86400 trước, hoặc là nó ngày hôm qua tại cùng một thời điểm trong ngày? Nếu không có thời gian như vậy trong ngày hôm qua vì đồng hồ đã thay đổi cho DST?).

Cú pháp đó cũng sẽ hoạt động với GNU date.

Với ast-open's date(hoặc ksh93's printf '%(%c)T'), bạn sẽ sử dụng:

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

thay thế.

Lưu ý rằng nếu bạn muốn báo cáo thời gian UTC (Zulu), bạn nên sử dụng TZ=UTC0 datehoặc date -unếu không, bạn sẽ có thời gian trong múi giờ của người dùng / hệ thống.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.