Изменение файла в подпапке не делает кэш недействительным (ADD или COPY) - PullRequest
0 голосов
/ 20 октября 2019

При попытке dockerise r-блестящего приложения у меня возникают проблемы с аннулированием кэша Docker. Изменение файла в /app, похоже, приводит к потере кеша только при выводе docker-compose build, это не отражается в контейнере, где файлы вообще не изменяются. Ниже выводится команда build:

Building app
Step 1/13 : FROM rocker/shiny:latestBuilding app
Step 1/13 : FROM rocker/shiny:latest
 ---> f184f6aaa052
Step 2/13 : RUN apt-get update && apt-get install libssl-dev -y     nano     libxml2-dev     libsodium-dev     libmariadbclient-dev     libhiredis-dev
 ---> Using cache
 ---> 03a28c35ec29
Step 3/13 : COPY install_packages.R  /tmp/install_packages.R
 ---> Using cache
 ---> f0f98562976d
Step 4/13 : RUN Rscript /tmp/install_packages.R
 ---> Using cache
 ---> 1f66021a00f5
Step 5/13 : RUN R -e "install.packages('devtools', dependencies = TRUE, repos = 'http://cran.rstudio.com/')"
 ---> Using cache
 ---> c65054a0b033
Step 6/13 : RUN R -e "devtools::install_github('PaulC91/shinyauthr', dependencies = TRUE)"
 ---> Using cache
 ---> 29135386a24f
Step 7/13 : ARG CACHEPOP=1
 ---> Using cache
 ---> 2916da43a88f
Step 8/13 : ADD shiny-server.conf /etc/shiny-server/shiny-server.conf
 ---> Using cache
 ---> f1289d6aba53
Step 9/13 : ADD shiny-server.sh /usr/bin/shiny-server.sh
 ---> Using cache
 ---> 87f462480ada
Step 10/13 : COPY app /srv/shiny-server/app
 ---> d89ae8e7fa85
Step 11/13 : RUN ["chmod", "+x", "/usr/bin/shiny-server.sh"]
 ---> Running in 27c53685d6ad
Removing intermediate container 27c53685d6ad
 ---> 6cb6baf130af
Step 12/13 : EXPOSE 3838
 ---> Running in 4425302562bb
Removing intermediate container 4425302562bb
 ---> e6c4fc565195
Step 13/13 : CMD ["usr/bin/shiny-server.sh"]
 ---> Running in 7723d0219648
Removing intermediate container 7723d0219648
 ---> 742d77a0a30e
Successfully built 742d77a0a30e
Successfully tagged redis-test:latest

 ---> f184f6aaa052
Step 2/13 : RUN apt-get update && apt-get install libssl-dev -y     nano     libxml2-dev     libsodium-dev     libmariadbclient-dev     libhiredis-dev
 ---> Using cache
 ---> 03a28c35ec29
Step 3/13 : COPY install_packages.R  /tmp/install_packages.R
 ---> Using cache
 ---> f0f98562976d
Step 4/13 : RUN Rscript /tmp/install_packages.R
 ---> Using cache
 ---> 1f66021a00f5
Step 5/13 : RUN R -e "install.packages('devtools', dependencies = TRUE, repos = 'http://cran.rstudio.com/')"
 ---> Using cache
 ---> c65054a0b033
Step 6/13 : RUN R -e "devtools::install_github('PaulC91/shinyauthr', dependencies = TRUE)"
 ---> Using cache
 ---> 29135386a24f
Step 7/13 : ARG CACHEPOP=1
 ---> Using cache
 ---> 2916da43a88f
Step 8/13 : ADD shiny-server.conf /etc/shiny-server/shiny-server.conf
 ---> Using cache
 ---> f1289d6aba53
Step 9/13 : ADD shiny-server.sh /usr/bin/shiny-server.sh
 ---> Using cache
 ---> 87f462480ada
Step 10/13 : COPY app /srv/shiny-server/app
 ---> d89ae8e7fa85
Step 11/13 : RUN ["chmod", "+x", "/usr/bin/shiny-server.sh"]
 ---> Running in 27c53685d6ad
Removing intermediate container 27c53685d6ad
 ---> 6cb6baf130af
Step 12/13 : EXPOSE 3838
 ---> Running in 4425302562bb
Removing intermediate container 4425302562bbBuilding app
Step 1/13 : FROM rocker/shiny:latest
 ---> f184f6aaa052
Step 2/13 : RUN apt-get update && apt-get install libssl-dev -y     nano     libxml2-dev     libsodium-dev     libmariadbclient-dev     libhiredis-dev
 ---> Using cache
 ---> 03a28c35ec29
Step 3/13 : COPY install_packages.R  /tmp/install_packages.R
 ---> Using cache
 ---> f0f98562976d
Step 4/13 : RUN Rscript /tmp/install_packages.R
 ---> Using cache
 ---> 1f66021a00f5
Step 5/13 : RUN R -e "install.packages('devtools', dependencies = TRUE, repos = 'http://cran.rstudio.com/')"
 ---> Using cache
 ---> c65054a0b033
Step 6/13 : RUN R -e "devtools::install_github('PaulC91/shinyauthr', dependencies = TRUE)"
 ---> Using cache
 ---> 29135386a24f
Step 7/13 : ARG CACHEPOP=1
 ---> Using cache
 ---> 2916da43a88f
Step 8/13 : ADD shiny-server.conf /etc/shiny-server/shiny-server.conf
 ---> Using cache
 ---> f1289d6aba53
Step 9/13 : ADD shiny-server.sh /usr/bin/shiny-server.sh
 ---> Using cache
 ---> 87f462480ada
Step 10/13 : COPY app /srv/shiny-server/app
 ---> d89ae8e7fa85
Step 11/13 : RUN ["chmod", "+x", "/usr/bin/shiny-server.sh"]
 ---> Running in 27c53685d6ad
Removing intermediate container 27c53685d6ad
 ---> 6cb6baf130afBuilding app
Step 1/13 : FROM rocker/shiny:latest
 ---> f184f6aaa052
Step 2/13 : RUN apt-get update && apt-get install libssl-dev -y     nano     libxml2-dev     libsodium-dev     libmariadbclient-dev     libhiredis-dev
 ---> Using cache
 ---> 03a28c35ec29
Step 3/13 : COPY install_packages.R  /tmp/install_packages.R
 ---> Using cache
 ---> f0f98562976d
Step 4/13 : RUN Rscript /tmp/install_packages.R
 ---> Using cache
 ---> 1f66021a00f5
Step 5/13 : RUN R -e "install.packages('devtools', dependencies = TRUE, repos = 'http://cran.rstudio.com/')"
 ---> Using cache
 ---> c65054a0b033
Step 6/13 : RUN R -e "devtools::install_github('PaulC91/shinyauthr', dependencies = TRUE)"
 ---> Using cache
 ---> 29135386a24f
Step 7/13 : ARG CACHEPOP=1
 ---> Using cache
 ---> 2916da43a88f
Step 8/13 : ADD shiny-server.conf /etc/shiny-server/shiny-server.conf
 ---> Using cache
 ---> f1289d6aba53
Step 9/13 : ADD shiny-server.sh /usr/bin/shiny-server.sh
 ---> Using cache
 ---> 87f462480ada
Step 10/13 : COPY app /srv/shiny-server/app
 ---> d89ae8e7fa85
Step 11/13 : RUN ["chmod", "+x", "/usr/bin/shiny-server.sh"]
 ---> Running in 27c53685d6ad
Removing intermediate container 27c53685d6ad
 ---> 6cb6baf130af
Step 12/13 : EXPOSE 3838
 ---> Running in 4425302562bb
Removing intermediate container 4425302562bb
 ---> e6c4fc565195
Step 13/13 : CMD ["usr/bin/shiny-server.sh"]
 ---> Running in 7723d0219648
Removing intermediate container 7723d0219648
 ---> 742d77a0a30e
Successfully built 742d77a0a30e
Successfully tagged redis-test:latest

Step 12/13 : EXPOSE 3838
 ---> Running in 4425302562bb
Removing intermediate container 4425302562bb
 ---> e6c4fc565195
Step 13/13 : CMD ["usr/bin/shiny-server.sh"]
 ---> Running in 7723d0219648
Removing intermediate container 7723d0219648
 ---> 742d77a0a30e
Successfully built 742d77a0a30e
Successfully tagged redis-test:latest

 ---> e6c4fc565195
Step 13/13 : CMD ["usr/bin/shiny-server.sh"]
 ---> Running in 7723d0219648
Removing intermediate container 7723d0219648
 ---> 742d77a0a30e
Successfully built 742d77a0a30e
Successfully tagged redis-test:latest

Как вы можете видеть, кеш действительно отключен на шаге 10/13 , но это не отражается внутри контейнера, где я до сих порувидеть старый файл (без добавления новых файлов). ADD и COPY дают одинаковое поведение.

Это нормальное поведение или что-то, чего я не вижу?

Структура папки и Dockerfile, ради тщательности:

.
├── app
│   ├── global.R
│   ├── mock_users.R
│   ├── server.R
│   ├── test.txt
│   └── ui.R
├── docker-compose.yml
├── Dockerfile
├── install_packages.R
├── readme.md
├── redis_cache_test.Rproj
├── shiny-server.conf
└── shiny-server.sh
FROM rocker/shiny:latest

# install openssl
# libsodium for shinyauthr
RUN apt-get update && apt-get install libssl-dev -y \
    nano \
    libxml2-dev \
    libsodium-dev \
    libmariadbclient-dev \
    libhiredis-dev

# install packages and remove downloaded files
COPY install_packages.R  /tmp/install_packages.R
RUN Rscript /tmp/install_packages.R

# install shiny authr package
RUN R -e "install.packages('devtools', dependencies = TRUE, repos = 'http://cran.rstudio.com/')"
RUN R -e "devtools::install_github('PaulC91/shinyauthr', dependencies = TRUE)"

# copy config files
ARG CACHEPOP=1
ADD shiny-server.conf /etc/shiny-server/shiny-server.conf
ADD shiny-server.sh /usr/bin/shiny-server.sh

# copy app
COPY app /srv/shiny-server/app

## allow permissions
RUN ["chmod", "+x", "/usr/bin/shiny-server.sh"]

# expose port
EXPOSE 3838

CMD ["usr/bin/shiny-server.sh"]

1 Ответ

0 голосов
/ 20 октября 2019

Как вы заметили, из ваших результатов сборки кеш действительно становится недействительным, и вы создаете новый образ с новым содержимым вашего каталога. Однако из комментариев вы затем запускаете этот контейнер с томом /app:/srv/shiny-server, который сопоставит доступ к этому каталогу внутри контейнера в /srv/shiny-server с хостом в /app. Обратите внимание, что этот путь является абсолютным, а не относительным путем, поэтому файлы находятся на хосте по адресу /app, а не в каталоге сборки в ./app.

. В зависимости от вашего варианта использованияразличные решения. Во-первых, в файле compose у вас есть доступ к относительным путям, поэтому, если вы проводите локальное тестирование (типичная причина для монтирования тома), вам часто нужно монтировать том с относительным путем, таким как ./app:/srv/shiny-server. В результате контейнер запускается с содержимым этого каталога без необходимости перестраивать образ, что часто предпочтительнее для более быстрых циклов разработки.

Если вы не хотите монтировать том, например, если он находится в производстве инет необходимости обращаться к файлам извне контейнера, тогда предпочтительнее удалить монтирование тома из файла compose.

И, наконец, если вам нужен внешний доступ к этим файлам, но вы хотите, чтобы ониобновите содержимое вашего изображения, затем вы обычно хотите сохранить содержимое тома в безопасном месте и обновить том сценарием точки входа. В моем docker-base repo я делаю это с помощью сценариев save-volume и load-volume, один из которых запускается во время сборки образа, а другой - во время точки входа при запуске контейнера.

...