Скопируйте каталог в другой каталог в Docker с помощью команды ADD

382

Я прочитал http://docs.docker.com/engine/reference/builder/#add, однако столкнулся с проблемой. Я хочу скопировать локальный каталог goв докер/user/local/

Я старался:

ADD go /usr/local/

а также:

ADD /go/ /usr/local/ 

также:

RUN chmod 0755 /usr/local/go/src/make.bash

Тем не менее, я вижу следующее сообщение об ошибке, /usr/local/go/src/make.bash: No such file or directoryно локальный goкаталог содержит make.bash.

pengwang
источник

Ответы:

705
ADD go /usr/local/

скопирует содержимое вашего локального goкаталога в/usr/local/ каталог вашего образа докера.

Чтобы скопировать сам goкаталог в /usr/local/использовании:

ADD go /usr/local/go

или

COPY go /usr/local/go
Thomasleveil
источник
43
Я пытаюсь использовать версию ADD с несколькими источниками, и поэтому не могу указать имя целевого каталога для места назначения. Есть ли способ сделать то, что запросил OP в формате multi-src (т.е. без создания ADDслоя для каждого исходного каталога)?
Гусс
9
Я просто хочу , чтобы добавить Sidenote к этому, говоря , что $HOMEили ~или любой другой переменной оболочки не будет работать. Я говорю это потому, что потратил много сил, пытаясь понять это, чем я хотел бы признаться, хотя это очевидно для большинства.
вопль
34
COPY go / usr / local / go не работает для меня. Не копирует.
Tyguy7
78
Это действительно довольно запутанный вопрос. Почему COPYпросто не может вести себя как cp? Вместо этого должна быть дополнительная полиция, как это работает.
Зельфир Кальцталь
14
Файл .dockerignore может скрывать каталог, и COPY или ADD не будут работать для перечисленных элементов
Vereb
49

Действительно ADD go /usr/local/добавит содержимое в goпапку , а не саму папку, вы можете использовать Thomasleveil решение или если это не сработало по какой - то причине вы можете изменить , WORKDIRчтобы /usr/local/затем добавить каталог к ней , как:

WORKDIR /usr/local/
COPY go go/

или

WORKDIR /usr/local/go
COPY go ./

Но если вы хотите добавить несколько папок, это будет раздражать, добавляя их таким образом, пока единственное решение, которое я вижу из моей текущей проблемы, заключается в использовании COPY . .и исключении всех нежелательных каталогов и файлов .dockerignore, скажем, у меня есть папки и файлы. :

- src 
- tmp 
- dist 
- assets 
- go 
- justforfun 
- node_modules 
- scripts 
- .dockerignore 
- Dockerfile 
- headache.lock 
- package.json 

и я хочу добавить src assets package.json justforfun goтак:

в Dockerfile:

FROM galaxy:latest

WORKDIR /usr/local/
COPY . .

в файле .dockerignore:

node_modules
headache.lock
tmp
dist

Или для большего удовольствия (или вам нравится путать больше людей, заставляющих их страдать: P) может быть:

*
!src 
!assets 
!go 
!justforfun 
!scripts 
!package.json 

Таким образом, вы игнорируете все, но исключаете то, что хотите скопировать или добавить только из «списка игнорирования».

Это поздний ответ, но он добавляет больше способов сделать то же самое, покрывая еще больше случаев.

Al-Mothafar
источник
12

Вы можете использовать COPY. Вам необходимо указать каталог явно. Он не будет создан сам по себе

COPY go /usr/local/go

Ссылка: ссылка Docker CP

Амстел д'Альмейда
источник