Moby: docker-commit e ADD / COPY truncam os tempos de modificação de arquivos e diretórios

Criado em 19 out. 2015  ·  3Comentários  ·  Fonte: moby/moby

Passos para reproduzir :

CÓPIA DE:

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

Resultados reais : o tempo de modificação de /example-file é relatado como 2015-10-19 13:13:28.000000000 +0000 .

Resultados esperados : o tempo de modificação de /example-file deve ser 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>:/#

Por que isso é importante?

Alguns sistemas de construção contam com carimbos de data / hora de modificação para detectar atualizações de arquivo.

Detalhes do ambiente :

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

Comentários muito úteis

Corri para isso hoje.

A única solução concebível é tarar os arquivos, copiá-los e extraí-los novamente ...

ATUALIZAR as operações adicionais de tar tornaram as coisas em geral mais lentas.

Todos 3 comentários

Corri para isso hoje.

A única solução concebível é tarar os arquivos, copiá-los e extraí-los novamente ...

ATUALIZAR as operações adicionais de tar tornaram as coisas em geral mais lentas.

Como esse problema está aberto há muito tempo, presumo que seja difícil corrigi-lo no Docker. Estou curioso para saber por que seria difícil preservar o carimbo de data / hora durante COPY ?

Este bug torna basicamente impossível selecionar apenas as partes que você precisa de um estágio existente usando "COPY --from" - porque toda vez que você faz, ele bagunça algo no subconjunto.

Já que normalmente se você compõe coisas você NÃO quer ter ferramentas como tar e co disponíveis (exceto quando você é o autor do tar, eu acho), a solução alternativa do tar também é um hack.

Além disso, digamos que você use outra coisa para preservar ou corrigir o carimbo de data / hora dentro da imagem do docker, agora sua imagem do docker tem o dobro do tamanho.

Portanto, o recurso de preservação de carimbos de data / hora é necessário.

Esta página foi útil?
0 / 5 - 0 avaliações