Dockerfile может копировать файлы в объявленный том, но RUN не может создавать файлы? - PullRequest
0 голосов
/ 24 апреля 2018

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

Для этого требуется, чтобы на этапе сборки некоторые данные копировались с хост-машины, а затем выполнялись некоторые сценарии, которые создают дополнительные файлы. Однако я заметил, что когда я смотрю на работающий контейнер, существуют только скопированные файлы, а созданные скриптами - нет. Я выполнил шаги до следующего файла Docker:

FROM ubuntu:xenial-20180112.1

VOLUME /test

COPY /test/copydir/copyfile.txt /test/copydir/copyfile.txt

RUN mkdir -p /test/mkdir && \
    touch /test/mkdir/touch.txt

Обратите внимание, что когда я захожу в работающий контейнер и выполняю

ls -l /test

Я получаю только папку «copydir». Однако, если я запускаю ls в моем файле Docker, я вижу, что обе папки существуют.

Что здесь происходит?

редактирование:

Для дополнительного контекста следующее распечатывает, что оба каталога существуют:

FROM ubuntu:xenial-20180112.1

VOLUME /test

COPY /test/copydir/copyfile.txt /test/copydir/copyfile.txt

RUN mkdir -p /test/mkdir && \
    touch /test/mkdir/touch.txt && \
    ls -l /test

Но следующее только показывает, что copydir существует:

FROM ubuntu:xenial-20180112.1

VOLUME /test

COPY /test/copydir/copyfile.txt /test/copydir/copyfile.txt

RUN mkdir -p /test/mkdir && \
    touch /test/mkdir/touch.txt

RUN ls -l /test

Ответы [ 3 ]

0 голосов
/ 24 апреля 2018

У меня нет точного объяснения этому, но когда вы создаете образ с помощью Dockerfile, он сделает изображение максимально легким. Когда вы используете RUN, вы не делаете данные постоянными, а выполняете только те действия, которые дадут результат, который не останется на изображении.

Обратите внимание, что команды apt-get и yum сохраняют установки. Это немного странно.

0 голосов
/ 13 мая 2018

В своем замечании вы сказали: «Приведенный мною пример был сокращен для ясности, на самом деле объем определяется родительским изображением».Это связало бы проблему со случаем, когда невозможно объявить запись объема для производного изображения.Если это возможно (например, с помощью docker-copyedit ), ваша проблема может исчезнуть.;)

0 голосов
/ 24 апреля 2018

Попробуйте изменить свой Dockerfile на:

FROM ubuntu:xenial-20180112.1

RUN mkdir -p /test
COPY /test/copydir/copyfile.txt /test/copydir/copyfile.txt

RUN mkdir -p /test/mkdir && \
    touch /test/mkdir/touch.txt

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