我正在尝试在Docker的实验性功能集中使用新的RUN --mount
选项,但是很难使其执行我想要的操作...
项目文件夹列表
hello.cpp
makefile
Dockerfile
Dockerfile如下:
#syntax=docker/dockerfile:experimental
FROM ubuntu
RUN --mount=type=cache,target=/home,source=. make
CMD ["bash"]
,构建命令如下:
docker build -t myimage:latest .
基本上,我想保留make
仅编译过期目标(使用COPY . /home
排除的目标)的优点,因为这似乎并不能保留跨复制文件的时间戳。 make
始终成就一切。
我将--mount
选项简化为最小集,我将添加uid=1000,gid=1000
或类似的IRL。
我收到的错误消息因我设置选项的方式而异。带有“未找到目录”消息的docker build
barfs,或者make
失败,显示“找不到makefile”。
我很确定我只是不知道如何正确设置source
和target
的值,并且没有发现the documentation有用。
谢谢!
答案 0 :(得分:0)
基本上,我想保留仅使编译过期的目标(使用COPY排除)的优点。 / home,因为这似乎并不太保留复制的文件上的时间戳。
我不认为这是正确的。首先,一个示例Dockerfile:
FROM busybox
COPY . /build-context
WORKDIR /build-context
CMD find .
我将其构建到称为上下文的图像中:
$ docker build -f df.build-context -t context .
[+] Building 7.4s (8/8) FINISHED
=> [internal] load build definition from df.build-context 1.2s
=> => transferring dockerfile: 118B 0.0s
=> [internal] load .dockerignore 0.7s
=> => transferring context: 34B 0.0s
=> [internal] load metadata for docker.io/library/busybox:latest 0.3s
=> CACHED [1/3] FROM docker.io/library/busybox 0.0s
=> [internal] load build context 1.1s
=> => transferring context: 2.56kB 0.4s
=> [2/3] COPY . /build-context 0.9s
=> [3/3] WORKDIR /build-context 0.6s
=> exporting to image 1.6s
=> => exporting layers 1.3s
=> => writing image sha256:c6971f5f817b746afd785c77d3...bcfb58f1 0.2s
=> => naming to docker.io/library/context 0.1s
如果我查看主机上的文件并将它们与上下文中包含的文件进行比较,我会看到最后修改的时间戳是相同的(唯一的显示差异是UTC和EDT时区的差异) :
$ docker run -it --rm context stat hello.sh
File: hello.sh
Size: 29 Blocks: 8 IO Block: 4096 regular file
Device: fe03h/65027d Inode: 24910346 Links: 1
Access: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2019-06-28 23:58:34.000000000
Modify: 2016-12-06 18:17:43.000000000
Change: 2019-06-28 23:58:32.000000000
$ stat hello.sh
File: hello.sh
Size: 29 Blocks: 8 IO Block: 4096 regular file
Device: fe03h/65027d Inode: 16526503 Links: 1
Access: (0755/-rwxr-xr-x) Uid: ( 1000/ bmitch) Gid: ( 1000/ bmitch)
Access: 2019-06-28 19:58:30.984110011 -0400
Modify: 2016-12-06 13:17:43.937302516 -0500
Change: 2017-06-21 17:17:15.052283710 -0400
Birth: -
在make的手册页中:
make程序使用makefile描述和文件的最后修改时间来确定哪些文件需要更新。
您应该检查其他地方是否更改了时间戳,因为如果它们在docker之外更改,则RUN --mount
仍将包含损坏的上次修改的时间戳。