Докер: додавання файлу з батьківського каталогу


186

У моєму Dockerfile:

ADD ../../myapp.war /opt/tomcat7/webapps/

Цей файл існує, оскільки ls ../../myapp.warповертає мені правильний файл, але коли я його виконую sudo docker build -t myapp .:

Step 1 : ADD ../../myapp.war /opt/tomcat7/webapps/
2014/07/02 19:18:09 ../../myapp.war: no such file or directory

Хтось знає, чому і як це зробити правильно?


2
Деякі обхідні шляхи superuser.com/questions/842642
Günter Zöchbauer

Відповіді:


225

Ви можете створити Dockerfile з батьківського каталогу:

docker build -t <some tag> -f <dir/dir/Dockerfile> .

3
Дякую! Це добре працює на локальному вікні, але Docker Hub не в змозі створити зображення, оскільки він намагається зробити це з того самого каталогу (tbh, саме те, що зазвичай очікується). Чи є такий же трюк у Docker Hub?
Марсель Ернандес

Не те, що я знаю. Ви можете натиснути на зображення до реєстру замість автоматизованої збірки.
Боеді

2
@ eduncan911 Я не думаю, що це застаріло в той час, коли я пишу свій коментар. Вони, можливо, з тих пір передумали? Якщо я помиляюся, чи можете ви зв’язатись із документацією, де сказано, що вона застаріла. Дякую!
omninonsense

6
-f не здається застарілим за документами -> Вкажіть Dockerfile (-f) : docs.docker.com/engine/reference/commandline/build/…
Рей

6
@ eduncan911 Ви можете видалити свій коментар, оскільки він, мабуть, не застарів? Я спочатку пропустив цю відповідь через ваш коментар.
Кріс Андерсон

103

На жаль, (начебто, з практичних та безпекових причин), якщо ви хочете додати / скопіювати локальний вміст, він повинен розташовуватися під тим же кореневим шляхом, ніж Dockerfile .

З документації :

Шлях <src> повинен знаходитися всередині контексту збірки; Ви не можете додати ../something / something, тому що перший крок побудови докера - це надіслати контекстну каталог (і підкаталоги) до демона docker.

EDIT: Тепер є можливість ( -f) встановити шлях вашого Dockerfile; його можна використовувати для досягнення того, що ви хочете, див. відповідь @Boedy нижче.


22
Чи є для цього "чистий" спосіб вирішення? Я б краще не реструктуризував весь свій каталог проектів просто для цього.
ben_frankly

Як сказав @ Günter, тут існує вирішення проблеми superuser.com/a/842690/136024 ... це справді "чисто"? Ну принаймні це "обхід" :)
Ентоні О.

2
Дивіться кращий відповідь від @Boedy stackoverflow.com/a/34300129/2950621
nmgeek

103

За допомогою docker-compose ви можете встановити контекстну папку:

#docker-compose.yml
version: '3.3'    
services:
      yourservice:
        build:
          context: ./
          dockerfile: ./docker/yourservice/Dockerfile

9

Додавання деяких фрагментів коду для підтримки прийнятої відповіді.

Структура каталогу:

setup/
 |__docker/DockerFile
 |__target/scripts/<myscripts.sh>
src/
 |__<my source files>

Запис файлу Докер:

RUN mkdir -p /home/vagrant/dockerws/chatServerInstaller/scripts/
RUN mkdir -p /home/vagrant/dockerws/chatServerInstaller/src/
WORKDIR /home/vagrant/dockerws/chatServerInstaller

#Copy all the required files from host's file system to the container file system.
COPY setup/target/scripts/install_x.sh scripts/
COPY setup/target/scripts/install_y.sh scripts/
COPY src/ src/

Команда, яка використовується для створення зображення докера

docker build -t test:latest -f setup/docker/Dockerfile .

чудовий підхід. Чи можливо також поділитися кодом install_x.sh?
Ariful Haque

4

Для тих, хто використовує композитор, рішення - використовувати том, що вказує на батьківську папку:

#docker-composer.yml

foo:
  build: foo
  volumes:
    - ./:/src/:ro

Але я впевнений, що це можна зробити, граючи з томами в Dockerfile .


3
Це не може. Примітка. Каталог хостів за своєю природою залежить від хоста. З цієї причини ви не можете встановити каталог хостів з Dockerfile, оскільки вбудовані зображення повинні бути портативними. Каталог хостів буде доступний не для всіх потенційних хостів. docs.docker.com/engine/tutorials/dockervolumes/…
Peeter Kokk

4

Оскільки -fвиникла ще одна проблема, я розробив інше рішення.

  • Створіть базове зображення у батьківській папці
  • Додані потрібні файли.
  • Використовували це зображення як базове зображення для проекту, який знаходиться в папці нащадків.

-fПрапор не вирішити мою проблему , тому що мої onbuildзображення шукає файл в папці і повинен був назвати так:

-f foo/bar/Dockerfile foo/bar

замість

-f foo/bar/Dockerfile .

Також зауважте, що це лише рішення для деяких випадків як -fпрапор

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.