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

В моем 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

Кто-нибудь знает, почему и как это сделать правильно?

Ответ 1

Вы можете создать файл Docker из родительского каталога:

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

Ответ 2

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

Из документации:

<src> путь должен находиться внутри контекста сборки; вы не может ADD../something/something, потому что первый шаг докера build - это отправить каталог контекста (и подкаталоги) в демон докеров.

EDIT: Теперь есть опция (-f), чтобы установить путь к вашему Dockerfile; его можно использовать для достижения того, чего вы хотите, см. @Boedy response nelow.

Ответ 3

С помощью docker-compose вы можете установить папку контекста:

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

Ответ 4

Решение для тех, кто использует composer - использовать том, указывающий на родительскую папку:

#docker-composer.yml

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

Но я почти уверен, что можно поиграть с объемами в Dockerfile.

Ответ 5

Так как -f вызвало еще одну проблему, я разработал другое решение.

  • Создайте базовое изображение в родительской папке
  • Добавлены необходимые файлы.
  • Используется это изображение в качестве базового изображения для проекта, который находится в папке потомка.

Флаг -f не решил мою проблему, потому что мой образ onbuild ищет файл в папке и должен был вызывать вот так:

-f foo/bar/Dockerfile foo/bar

вместо

-f foo/bar/Dockerfile .

Также обратите внимание, что это только решение для некоторых случаев как -f flag

Ответ 6

Добавление фрагментов кода для поддержки принятого ответа.

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

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

Запись файла Docker:

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 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 .