Как заставить docker build перезаписать файл?

Похоже, что сборка докеров не перезапишет файл, который ранее скопировал. У меня есть файл докеров с несколькими инструкциями копирования, и файлы, затронутые в более ранних директивах COPY, не перезаписываются более поздними.

Упрощенный пример (хотя это также происходит, если первая копия представляет собой весь каталог, в котором содержится файл в вопросе):

COPY docker/config/file1.yml $BASE/config/thatfile.yml
COPY docker/config/file2.yml $BASE/config/thatfile.yml

После сборки $ BASE / config / thatfile.yml будет содержать содержимое file1.yml. Есть ли способ заставить его содержать содержимое file2.yml?

Мой основной вариант использования здесь - это копирование всей папки с файлами конфигурации, а затем замена выбранных файлов конфигурации для конкретных сборок.

1
задан 24 September 2019 в 23:25
3 ответа

Непроверено:

COPY dir lol
RUN cp -a lol $BASE

Обновление. Я не могу понять поведение вашего исходного сообщения. Вы должны быть троллем, использовать другую версию или у вас есть docker-compose, который монтирует что-то поверх чего-то. ;);)

https://github.com/bor8/lolquadrat

git clone https://github.com/bor8/lolquadrat
cd lolquadrat/
docker build --no-cache .

Последний вывод:

Step 1/6 : FROM busybox:latest
 ---> 19485c79a9bb
Step 2/6 : ARG BASE=/opt/hihi
 ---> Running in e4a01850931e
Removing intermediate container e4a01850931e
 ---> 193009cc4df9
Step 3/6 : COPY docker/config/file1.yml $BASE/config/thatfile.yml
 ---> bea7783ade65
Step 4/6 : RUN echo 'first thatfile:' && cat ${BASE}/config/thatfile.yml
 ---> Running in 201e86de06bc
first thatfile:
file1content
Removing intermediate container 201e86de06bc
 ---> ca7676a83a16
Step 5/6 : COPY docker/config/file2.yml $BASE/config/thatfile.yml
 ---> da5985cd90fb
Step 6/6 : RUN echo 'second thatfile:' && cat ${BASE}/config/thatfile.yml
 ---> Running in f70153917070
second thatfile:
file2content
Removing intermediate container f70153917070
 ---> 5a4b17a1e77e
Successfully built 5a4b17a1e77e

В работающем контейнере также отображается file2content . Чтобы проверить это, вы можете сделать CMD tail -f / dev / null в последней строке вашего файла Docker, а затем использовать docker exec -it / bin / sh . cat thatfile.yml .

Я еще не полностью проверил, существует ли такое же поведение для папки (по сравнению с file1.yml ).

0
ответ дан 4 December 2019 в 02:42

Я тоже испытал это, но после долгого тестирования обнаружил опечатку в одном из путей назначения директив COPY .

Еще раз проверьте, куда на самом деле идут эти файлы

-COPY nginx.conf /etc/ngnix/nginx.conf
+COPY nginx.conf /etc/nginx/nginx.conf
4
ответ дан 31 March 2020 в 23:16
-

Может быть, у вас смонтирован том?

COPY local_file.txt /directory-in-container/

Вышеописанное не работает, если /каталог-в-контейнере является смонтированным томом.

0
ответ дан 31 May 2021 в 05:50

Теги

Похожие вопросы