Moby: docker-commit und ADD/COPY kürzen die Änderungszeiten von Dateien und Verzeichnissen

Erstellt am 19. Okt. 2015  ·  3Kommentare  ·  Quelle: moby/moby

Schritte zur Reproduktion :

KOPIEREN:

gg7<strong i="8">@gg7</strong>:~$ mkdir docker-mtime-test
gg7<strong i="9">@gg7</strong>:~$ cd docker-mtime-test

gg7<strong i="10">@gg7</strong>:~/docker-mtime-test$ touch example-file
gg7<strong i="11">@gg7</strong>:~/docker-mtime-test$ stat example-file
  File: ‘example-file’
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: fc01h/64513d    Inode: 7602338     Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1001/  gg7)   Gid: ( 1001/  gg7)
Access: 2015-10-19 14:13:28.441785563 +0100
Modify: 2015-10-19 14:13:28.441785563 +0100
Change: 2015-10-19 14:13:28.441785563 +0100
 Birth: -

gg7<strong i="12">@gg7</strong>:~/docker-mtime-test$ cat > Dockerfile <<EOF
FROM ubuntu:14.04
COPY example-file /example-file
RUN stat /example-file
EOF

gg7<strong i="13">@gg7</strong>:~/docker-mtime-test$ docker build --no-cache -t docker-mtime-test .
Sending build context to Docker daemon  2.56 kB
Step 0 : FROM ubuntu:14.04
 ---> fa81ed084842
Step 1 : COPY example-file /example-file
 ---> 8212ccaf4c14
Removing intermediate container cece2b393603
Step 2 : RUN stat /example-file
 ---> Running in 86bd29f2fa49
  File: '/example-file'
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 6ch/108d        Inode: 43          Links: 1
Access: (0664/-rw-rw-r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2015-10-19 13:15:27.415707557 +0000
Modify: 2015-10-19 13:13:28.000000000 +0000
Change: 2015-10-19 13:15:27.415707557 +0000
 Birth: -
 ---> cb0e1fdb58bd
Removing intermediate container 86bd29f2fa49
Successfully built cb0e1fdb58bd

Tatsächliche Ergebnisse : Die Änderungszeit von /example-file wird mit 2015-10-19 13:13:28.000000000 +0000 gemeldet.

Erwartete Ergebnisse : Die Änderungszeit von /example-file sollte 2015-10-19 13:13:28.441785563 +0000 .

docker-commit :

gg7<strong i="26">@gg7</strong>:~$  docker run -it --name mtime-test ubuntu:14.04 /bin/bash
root<strong i="27">@613e6c0fe6ac</strong>:/# touch /example-file
root<strong i="28">@613e6c0fe6ac</strong>:/# stat /example-file
  File: '/example-file'
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 66h/102d        Inode: 72          Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2015-10-19 13:36:29.888088708 +0000
Modify: 2015-10-19 13:36:29.888088708 +0000
Change: 2015-10-19 13:36:29.888088708 +0000
 Birth: -
root<strong i="29">@613e6c0fe6ac</strong>:/# exit
exit
gg7<strong i="30">@gg7</strong>:~$ docker commit mtime-test mtime-test-image
b67d16fcb577fb3ece29cf007f1cef2ebc4a6351bc3e3a3e77eab5648461095c
gg7<strong i="31">@gg7</strong>:~$ docker run -it --name mtime-test-2 mtime-test-image /bin/bash
root<strong i="32">@1a5e038e6a2c</strong>:/# stat /example-file
  File: '/example-file'
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 66h/102d        Inode: 75          Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2015-10-19 13:36:55.572503813 +0000
Modify: 2015-10-19 13:36:29.000000000 +0000
Change: 2015-10-19 13:36:55.572503813 +0000
 Birth: -
root<strong i="33">@1a5e038e6a2c</strong>:/#

Warum ist das wichtig?

Einige Buildsysteme verlassen sich auf Änderungszeitstempel, um Dateiaktualisierungen zu erkennen.

Umgebungsdetails :

cat /etc/lsb-release :

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.3 LTS"

uname -a :

Linux gg7 3.13.0-51-generic #84-Ubuntu SMP Wed Apr 15 12:08:34 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

docker version :

Client:
 Version:      1.8.3
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   f4bf5c7
 Built:        Mon Oct 12 05:37:18 UTC 2015
 OS/Arch:      linux/amd64

Server:
 Version:      1.8.3
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   f4bf5c7
 Built:        Mon Oct 12 05:37:18 UTC 2015
 OS/Arch:      linux/amd64

docker info :

Containers: 8
Images: 632
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 656
 Dirperm1 Supported: false
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 3.13.0-51-generic
Operating System: Ubuntu 14.04.3 LTS
CPUs: 8
Total Memory: 15.66 GiB
Name: gg7
ID: ACSH:EYI5:G36O:2SRA:FWLH:U4GF:VMJM:C4KF:73MH:L273:TCCO:GW3K
WARNING: No swap limit support
arebuilder kinenhancement versio1.8

Hilfreichster Kommentar

Bin heute gerade darauf gestoßen.

Der einzig denkbare Workaround besteht darin, Dateien zu tarieren, zu KOPIEREN und erneut zu extrahieren...

UPDATE die zusätzlichen tar-Operationen machten die Sache insgesamt langsamer.

Alle 3 Kommentare

Bin heute gerade darauf gestoßen.

Der einzig denkbare Workaround besteht darin, Dateien zu tarieren, zu KOPIEREN und erneut zu extrahieren...

UPDATE die zusätzlichen tar-Operationen machten die Sache insgesamt langsamer.

Da dieses Problem schon so lange offen ist, gehe ich davon aus, dass es in Docker schwer zu beheben sein kann. Ich bin neugierig, warum es schwierig wäre, den Zeitstempel während COPY beizubehalten?

Dieser Fehler macht es im Grunde unmöglich, mit "COPY --from" nur Teile auszuwählen, die Sie von einer vorhandenen Stufe benötigen, da jedes Mal, wenn Sie dies tun, etwas in der Untermenge durcheinander gebracht wird.

Da Sie normalerweise, wenn Sie Dinge komponieren, KEINE Tools wie tar und co zur Verfügung haben möchten (außer wenn Sie der Autor von tar sind, nehme ich an), ist auch die tar-Lösung ein Hack.

Angenommen, Sie verwenden etwas anderes, um den Zeitstempel im Docker-Image entweder beizubehalten oder zu korrigieren. Ihr Docker-Image ist jetzt doppelt so groß.

Daher ist die Funktion zum Beibehalten von Zeitstempeln erforderlich.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen