Ответ 1
Вы можете создать файл Docker из родительского каталога:
docker build -t <some tag> -f <dir/dir/Dockerfile> .
В моем 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
Кто-нибудь знает, почему и как это сделать правильно?
Вы можете создать файл Docker из родительского каталога:
docker build -t <some tag> -f <dir/dir/Dockerfile> .
К сожалению, (по практическим соображениям и соображениям безопасности, я думаю), если вы хотите добавить/скопировать локальный контент, он должен находиться под одним корневым путем, чем Dockerfile
.
Из документации:
<src> путь должен находиться внутри контекста сборки; вы не может ADD../something/something, потому что первый шаг докера build - это отправить каталог контекста (и подкаталоги) в демон докеров.
EDIT: Теперь есть опция (-f
), чтобы установить путь к вашему Dockerfile; его можно использовать для достижения того, чего вы хотите, см. @Boedy response nelow.
С помощью docker-compose вы можете установить папку контекста:
#docker-compose.yml
version: '3.3'
services:
yourservice:
build:
context: ./
dockerfile: ./docker/yourservice/Dockerfile
Решение для тех, кто использует composer - использовать том, указывающий на родительскую папку:
#docker-composer.yml
foo:
build: foo
volumes:
- ./:/src/:ro
Но я почти уверен, что можно поиграть с объемами в Dockerfile.
Так как -f
вызвало еще одну проблему, я разработал другое решение.
Флаг -f
не решил мою проблему, потому что мой образ onbuild
ищет файл в папке и должен был вызывать вот так:
-f foo/bar/Dockerfile foo/bar
вместо
-f foo/bar/Dockerfile .
Также обратите внимание, что это только решение для некоторых случаев как -f
flag
Добавление фрагментов кода для поддержки принятого ответа.
Структура каталогов:
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 .