Шаги по воспроизведению :
КОПИЯ:
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
Фактические результаты : сообщается, что время модификации /example-file
составляет 2015-10-19 13:13:28.000000000 +0000
.
Ожидаемые результаты : время изменения /example-file
должно быть 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>:/#
Почему это важно?
Некоторые системы сборки полагаются на временные метки модификации для обнаружения обновлений файлов.
Детали окружающей среды :
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
Просто столкнулся с этим сегодня.
Единственный возможный обходной путь - это тарирование файлов, их копирование и повторное извлечение ...
ОБНОВЛЕНИЕ: дополнительные операции с tar в целом замедлили работу.
Учитывая, что эта проблема существует так долго, я полагаю, что ее сложно исправить в Docker. Мне любопытно, почему было бы сложно сохранить временную метку во время COPY
?
Эта ошибка делает практически невозможным выбрать только нужные вам части из существующей стадии с помощью «COPY --from» - потому что каждый раз, когда вы это делаете, в подмножестве что-то портится.
Поскольку обычно, если вы создаете что-то, вы НЕ хотите, чтобы были доступны такие инструменты, как tar и co (за исключением случаев, когда вы являетесь автором tar, я полагаю), обходной путь tar также является хаком.
Кроме того, предположим, что вы используете что-то еще, чтобы сохранить или исправить метку времени внутри образа докера, теперь ваш образ докера в два раза больше.
Следовательно, функция сохранения временных меток необходима.
Самый полезный комментарий
Просто столкнулся с этим сегодня.
Единственный возможный обходной путь - это тарирование файлов, их копирование и повторное извлечение ...
ОБНОВЛЕНИЕ: дополнительные операции с tar в целом замедлили работу.