Результат RUN скрипта .sh из Dockerfile не сохраняется в образ - PullRequest
0 голосов
/ 13 ноября 2018

После RUN ["./run.sh"] папка, созданная run.sh, видна изнутри скрипта, но теряется при продолжении Docker.

Ожидаемое поведение: Я хотел бы иметь доступ к public / *Папка 1006 *, которая создается сценарием run.sh.

Dockerfile

  ...
  RUN mkdir -p /opt/site
  WORKDIR /opt/site
  VOLUME /opt/site
  COPY . .

  RUN ["chmod", "+x", "./run.sh"]
  RUN ["./run.sh"]
  RUN pwd
  RUN ls
  RUN ls public

  FROM nginx
  COPY --from=build-stage /opt/site/public /usr/share/nginx/html

Script

  #!/usr/bin/env bash
  rm -rf public/ node_modules/ node_modules/.bin/ package-lock.json yarn.lock
  npm install
  ls
  touch newfile.txt
  npm run build
  ls

ls изнутри сценария run.shпосле build.Папка public присутствует.

...
Generated public/sw.js, which will precache 6 files, totaling 197705 bytes.
info Done building in 44.842 sec
*ls*
Dockerfile
config
gatsby-config.js
gatsby-node.js
newfile.txt
node_modules
package-lock.json
package.json
postcss.config.js
public
run.sh
src
static
tailwind.css
tailwind.js

ls изнутри Dockerfile.Папка public отсутствует, и попытка взаимодействия с ней приводит к сбою.

Removing intermediate container 1692fb171673
 ---> 474d83267ccb
Step 10/14 : RUN pwd
 ---> Running in 7c351b151904
/opt/site
Removing intermediate container 7c351b151904
 ---> bae37da8b513
Step 11/14 : RUN ls
 ---> Running in 384daf575cae
Dockerfile
config
gatsby-config.js
gatsby-node.js
package-lock.json
package.json
postcss.config.js
run.sh
src
static
tailwind.css
tailwind.js
Removing intermediate container 384daf575cae
 ---> 1f6743a4adc1
Step 12/14 : RUN ls public
 ---> Running in 7af84c5d72a0
ls: cannot access public: No such file or directory
The command '/bin/sh -c ls public' returned a non-zero code: 2
ERROR: Job failed: exit code 2

1 Ответ

0 голосов
/ 13 ноября 2018

Вы создали том с выбранным каталогом:

  VOLUME /opt/site

При определении в изображении будет создан том для каждого контейнера, созданного из этого изображения. Если вы не укажете источник для тома (который вы не можете во время сборки), Docker создаст анонимный том. И с именованным, и с анонимным томом docker инициализирует содержимое изображения в этом месте.

Результат выполнения команды RUN следующий:

  • создать временный контейнер
  • этот временный контейнер выполняет запрошенную команду и проверяет код завершения перед продолжением
  • в случае успеха Docker фиксирует результат сравнения между изображением и контейнером. Это в основном контейнерный слой файловой системы для чтения / записи. Однако он не включает никаких внешних томов.

Это поведение задокументировано докером :

  • Изменение тома из Dockerfile: Если какие-либо шаги сборки изменят данные в томе после того, как он был объявлен, эти изменения будут отброшены.

Моя стандартная рекомендация - удалить любое определение тома из Dockerfile. Если вам нужен том, определите его во время выполнения с помощью чего-то вроде файла создания Docker. Это позволяет расширять образ и предотвращает загромождение файловой системы анонимными томами.

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