Многоступенчатая сборка Docker COPY не выполнена, файл не найден - PullRequest
0 голосов
/ 07 января 2019

У меня есть многоступенчатый Dockerfile для небольшого сайта Jekyll.

Dockerfile:

FROM jekyll/minimal AS build

COPY . /srv/jekyll

RUN jekyll build

FROM pierrezemb/gostatic

COPY --from=build /srv/jekyll/_site /srv/http

Docker завершает работу на последнем этапе со следующей ошибкой:

Step 5/5 : COPY --from=build /srv/jekyll/_site /srv/http
COPY failed: stat /var/lib/docker/overlay2/e6b407b63b9578dd7ae4ccba968fff3f4e28e35e50e887c09319b32ccd548356/merged/srv/jekyll/_site: no such file or directory

Если я удаляю второй FROM и exec в контейнер сборки, я вижу, что файлы существуют в /srv/jekyll/_site.

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Похоже, что / srv / jekyll определяется как объем в вашем родительском изображении. Если вы создадите контейнер из этого изображения, он будет напрямую не из изображения, а из созданного временного тома, что приведет к неожиданному поведению. Во время сборки, если вы попытаетесь изменить содержимое этого каталога с помощью команды RUN, все эти изменения будут потеряны в конце этой команды run при очистке анонимного тома.

Я бы порекомендовал заставить создателя исходной версии этого изображения удалить определение VOLUME из их Dockerfile, или разветвить репо и создать свой собственный без этого тома. Вы всегда можете определить объем во время выполнения без объема, определенного в образе, но как только он будет определен в образе, этот объем будет влиять на вашу способность работать с каталогом.

0 голосов
/ 07 января 2019

Я взял ваш докер-файл и следовал учебному пособию по быстрому запуску jekyll . Хотя я на самом деле не могу собрать ваш dockerfile, так как вы выбрали базовый образ jekyll / минимальный, изменение его на jekyll / builder заставляет весь процесс работать с небольшими изменениями. Вместо этого я строю в папке / tmp.

Truncated...
Fetching minima 2.5.0
Installing minima 2.5.0
Bundle complete! 4 Gemfile dependencies, 29 gems now installed.
Bundled gems are installed into `/usr/local/bundle`
The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.
ruby 2.6.0p0 (2018-12-25 revision 66547) [x86_64-linux-musl]
Configuration file: /tmp/_config.yml
            Source: /tmp
       Destination: /tmp/_site
 Incremental build: disabled. Enable with --incremental
      Generating...
       Jekyll Feed: Generating feed for posts
                    done in 0.507 seconds.
 Auto-regeneration: disabled. Use --watch to enable.
Removing intermediate container 10159e9e7776
 ---> cab3989600a7
Step 5/6 : FROM pierrezemb/gostatic
 ---> bbc54b2880be
Step 6/6 : COPY --from=build /tmp/_site /srv/http
 ---> 860f5db9d0f3
Successfully built 860f5db9d0f3
Successfully tagged test:latest

Если вы отправите мне ссылку GitHub на ваш код, я посмотрю, возможно, вы где-то сделали опечатку?

(Вот мой dockerfile, который работает с руководством от jekyll)

FROM jekyll/builder as build
WORKDIR /tmp
COPY . /tmp

RUN jekyll build

FROM pierrezemb/gostatic

COPY --from=build /tmp/_site /srv/http
...