когда я добавляю файл или каталог к файлу докеров с помощью файла Docker, я использую ADD или COPY, но путь к файлу, который я хочу добавить или скопировать, должен относительный путь к каталогу Dockerfile. Есть ли способ добавления файла или каталога с локального образа на изображение докеров, используя абсолютный путь? Кстати, почему "docker cp" поддерживает только копирование файла с изображения докеров на localhost? напротив, он не работает?
Как скопировать каталог или файл на изображение докеров с localhost на ubuntu14.04?
Ответ 1
Короткий ответ: он не поддерживается.
Из Документы Docker:
<src> путь должен находиться внутри контекста сборки; вы не можете ADD../something/something, потому что первый шаг сборки docker заключается в том, чтобы отправить каталог контекста (и подкаталоги) демонам докеров.
Кроме того, символические ссылки не поддерживаются, поэтому невозможно обмануть сборку, связав ее с другим местом на локальном хосте.
Однако URL-адреса поддерживаются, поэтому один из способов обойти проблему состоит в том, чтобы обслуживать файлы через HTTP, если вы включили веб-сервер на своем локальном хосте (или в контейнере докера).
Команда docker cp
(к сожалению) поддерживается только от контейнера к хосту, а не наоборот. Это описано в docs. Способ обойти это использовать докеры тома, где данные могут быть разделены.
Ответ 2
Решение для тех, кто использует композитор, заключается в использовании volume, указывающего на папку:
#docker-composer.yml
foo:
build: foo
volumes:
- /local/path/:/path/:ro
Но я уверен, что можно сделать игру с томами в Dockerfile.
Ответ 3
Существует обходной путь, когда вы используете docker-compose
:
api1:
build: .
dockerfile: cluster/manifests/Dockerfile-NodeAPI
ports:
- 8080
links:
- mongo
- redis
command: "nodemon lib/app.js -e js,json,scss,css,html"
Это все равно не позволит вам делать пути родственников, однако базовый путь в Dockerfile
будет ./
вместо cluster/manifests/
Ответ 4
Чтобы скопировать файл, просто используйте docker cp
:
docker cp file.txt CONTAINER:/path/to/dest
Чтобы скопировать каталог, используйте tar файл:
tar -c "dir/" | docker run -i -a stdin CONTAINER tar -xC /path/to/dest
Ответ 5
Исходя из ответа, вы также можете использовать докеры SDK для этого. Я не уверен в каждом SDK, но по крайней мере docker-java отправляет контекст в качестве входного потока для докеров. Итак, вы указываете dockerClient.withBaseDirectory()
и dockerClient.withDockerFile()
. Вы можете использовать более скриптовый подход и использовать gradle или groovy для этого и избегать "компилировать" java для этого каждый раз.