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
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.
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.