Как скопировать каталог или файл на изображение докеров с localhost на ubuntu14.04?

когда я добавляю файл или каталог к ​​файлу докеров с помощью файла Docker, я использую ADD или COPY, но путь к файлу, который я хочу добавить или скопировать, должен относительный путь к каталогу Dockerfile. Есть ли способ добавления файла или каталога с локального образа на изображение докеров, используя абсолютный путь? Кстати, почему "docker cp" поддерживает только копирование файла с изображения докеров на localhost? напротив, он не работает?

Ответ 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 для этого каждый раз.