Docker ADD и COPY не учитываются в Dockerfile - PullRequest
0 голосов
/ 27 сентября 2019

Когда я пытаюсь создать следующий Dockerfile, шаги ADD и COPY ничего не делают:

# Use an official Apache runtime as a parent image
FROM amd64/httpd

# Set the working directory
WORKDIR  /usr/local/apache2

# Copy the following contents into the container
ADD ./httpd.conf {$workdir}/conf/httpd.conf
COPY ./Projects/RavensHomeSupport/build/* {$workdir}/htdocs/Test/

# Make port 80 available to the world outside this container
EXPOSE 80

# Define environment variable
ENV NAME RavensHomeWeb

Я запускаю следующую команду сборки:

docker build -t ravenshome --rm --no-cache .

и когда я проверяюсодержимое каталога Test в работающем контейнере, ни одно из ожидаемых данных не было скопировано в контейнер.Выходные данные команды build находятся здесь.

Sending build context to Docker daemon  1.444MB
Step 1/6 : FROM amd64/httpd
 ---> 19459a872194
Step 2/6 : WORKDIR  /usr/local/apache2
 ---> Running in 192cb44f767e
Removing intermediate container 192cb44f767e
 ---> d9816ea17258
Step 3/6 : ADD ./httpd.conf {$workdir}/conf/
 ---> 19f48db970bb
Step 4/6 : COPY ./Projects/RavensHomeSupport/build/ {$workdir}/htdocs/Test/
 ---> d93939218c2b
Step 5/6 : EXPOSE 80
 ---> Running in 43b9e9297f60
Removing intermediate container 43b9e9297f60
 ---> 3b994be07747
Step 6/6 : ENV NAME RavensHomeWeb
 ---> Running in a64bccaf81c8
Removing intermediate container a64bccaf81c8
 ---> 9217c242868c
Successfully built 9217c242868c
Successfully tagged ravenshome:latest

Я запускаю контейнер с помощью следующей команды:

docker run -dit -p 8080:80 --name ravenshome ravenshome

Когда я проверяю проблемный каталог в контейнере с помощью следующей команды:

docker exec ravenshome ls -a /usr/local/apache2/htdocs

Я получаю следующий результат:

.
..
index.html

Как видите, все, что было, это содержимое изображения по умолчанию, а не дополнительное, которое я ожидал.Точно так же моя настроенная версия httpd.conf не копируется в новый контейнер.Я прочитал несколько постов, которые предполагают, что проблема связана с использованием томов, но я этого не делаю, и при этом у меня нет файла .dockerignore.Кто-нибудь может увидеть, что я делаю не так?

1 Ответ

1 голос
/ 27 сентября 2019

$workdir не является определенной переменной среды, поэтому она расширяется до пустой строки.$variable внутри фигурных скобок вообще не является специальным синтаксисом;он расширяется до расширения переменной внутри фигурных скобок.Конечным результатом этого является то, что эти две строки:

WORKDIR  /usr/local/apache2
ADD ./httpd.conf {$workdir}/conf/httpd.conf

копируют содержимое в каталог /usr/local/apache2/{}/conf/http.conf - внутри фигурных скобок ничего нет, а сами фигурные скобки интерпретируются как каталог относительнотекущий рабочий каталог.

Вам здесь вообще не нужна переменная окружения;Вы можете просто COPY к текущему WORKDIR

WORKDIR /usr/local/apache2
ADD ./httpd.conf ./conf/httpd.conf
COPY ./Projects/RavensHomeSupport/build/* ./htdocs/Test/

См. также Подстановка переменных в документации docker-compose.yml для разрешенных форм;вы, вероятно, думаете о синтаксисе ${variable} (доллары за пределами фигурных скобок).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...