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

Вкратце: файл, который я удаляю из контейнера Docker, снова появляется после того, как я зафиксирую исходный контейнер и создаю новый из зафиксированного.

У меня есть следующий Dockerfile:

FROM ubuntu:latest

VOLUME /docker-entrypoint-initdb.d

COPY docker-entrypoint.sh /usr/local/bin/
COPY docker-entrypoint-initdb.sh /usr/local/bin/
COPY delete-me.sh /docker-entrypoint-initdb.d/setup/

ENTRYPOINT "docker-entrypoint.sh"

Я настрою громкость и скопируйте некоторые файлы в контейнер.

docker-entrypoint.sh => точка входа actall, как показано в файле Docker

#!/usr/bin/env bash

docker-entrypoint-initdb.sh && exec /bin/bash -c "trap : TERM INT; sleep infinity & wait"

Docker-entryPoint-initdb.sh = & gt; Сценарий, содержащий команды, которые должны работать при создании контейнера. (В моем реальном мировом проекте некоторые из них всегда должны работать и некоторые только в первый раз. Сценарий в основном итерации по поводу папки /docker-entrypoint-initdb.d/setup / и запускает все скрипты внутри из этого.)

#!/usr/bin/env bash
sh /docker-entrypoint-initdb.d/setup/delete-me.sh
rm -R /docker-entrypoint-initdb.d/setup/ 2> /dev/null

delete-me.sh => Этот файл содержит логику, которая должна запускаться только при первом создании контейнера из этого образа. Во всех последующих запусках этот файл уничтожит данные и сделает контейнер непригодным для использования.

echo DELETE_ME

Контейнер построен с помощью команды docker build -f Dockerfile -t ubu-test.

И бегите с docker run -d ubu-test.

После того, как я запускаю контейнер в первый раз, он правильно настроен. Сценарий DELETE-ME.SH работает и чем удален Docker-entryPoint-initdb.sh .

Я docker commit контейнер после первого запуска.

Теперь проблема: когда я создаю новый контейнер от принятого одного файла delete-me.sh снова.

Не понимаю почему. (Я подтвердил, что он был удален в контейнере, который я поместил в него docker exec -it.)

0
Christian 14 Мар 2018 в 16:47

1 ответ

Лучший ответ

Проблема вызвана громкостью. Как указано в документах для фиксации докеров:

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

Compare Docker приведет к изменению файловой системы контейнеров в новое изображение. Так как /docker-entrypoint-initdb.d - это объем, Все изменения файлов, выполненных в этом каталоге, не будут частью комбинезонного контейнера, поскольку объемы не хранятся в копировальной записи Файловая система, которая хранит контейнер.

В качестве решения вы можете удалить объявление VOLUME из Dockerfile.

В качестве альтернативы, дайте объем имя и повторно повторно повторно повторно, как таковое:

docker run -v initdb:/docker-entrypoint-initdb.d -d ubu-test
0
yamenk 14 Мар 2018 в 17:04