как я могу смонтировать локальную папку с помощью dockerfile RUN --mount? - PullRequest
0 голосов
/ 29 июня 2019

Я пытаюсь использовать новую опцию RUN --mount в экспериментальном наборе функций докера, но мне трудно заставить ее делать то, что я хочу, а именно ...

список папок проекта

hello.cpp
makefile
Dockerfile

И Dockerfile выглядит так:

#syntax=docker/dockerfile:experimental
FROM ubuntu

RUN --mount=type=cache,target=/home,source=. make

CMD ["bash"]

и команда build выглядит следующим образом:

docker build -t myimage:latest .

По сути, я хочу сохранить преимущество, заключающееся в том, что make компилирует только устаревшие цели, что исключает использование COPY . /home, потому что это не слишком сохраняет временные метки для файлов, скопированных через. make всегда делает все.

N.B. Я упростил опции --mount до минимального набора, IRL я бы добавил uid=1000,gid=1000 или аналогичный.

Сообщения об ошибках, которые я получаю, зависят от того, как я установил параметры. Либо docker build barfs с сообщением «каталог не найден», либо make завершается с ошибкой «файл не найден».

Я почти уверен, что просто не знаю, как правильно установить значения source и target, и не нахожу документацию полезной.

Спасибо!

1 Ответ

0 голосов
/ 29 июня 2019

По сути, я хочу сохранить преимущество, которое делает компиляция только устаревших целей, что исключает использование 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 использует описание make-файла и время последнего изменения файлов, чтобы решить, какие из файлов необходимо обновить.

Вы должны проверить в другом месте что-то, изменяющее ваши временные метки, потому что, если они меняются вне докера, RUN --mount все равно будет содержать поврежденную последнюю измененную временную метку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...