Оператор Dockerfile RUN не выполняется - PullRequest
0 голосов
/ 12 марта 2020

Мой Dockerfile выглядит примерно так.

FROM postgres:12.2

RUN apt-get install -y postgresql-12-cron                     \
 && echo "shared_preload_libraries = 'pg_cron'" >>            \
         /var/lib/postgresql/data/postgresql.conf

Установлен пакет postgresql -12-cron, хотя он ворчит о debconf и не может найти Dialog ... когда я запускаю c в созданный контейнер я вижу, что пакет находится там.

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

RUN echo "shared_preload_libraries = 'pg_cron'" >> /var/lib/postgresql/data/postgresql.conf

Это производит вывод во время сборки, который выглядит примерно так:

Step 7/7 : RUN echo "shared_preload_libraries = 'pg_cron'" >> /var/lib/postgresql/data/postgresql.conf

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

Я смутно знаю о другом сценарии ios, где это происходит, и это не синтаксическая ошибка или что-то в этом роде, а неправильное представление со стороны человека, пишущего Dockerfile о том, как это работает. Но я в Google пустую. Что мне не хватает?

Примечание. Это упрощенная версия файла Docker, я пытаюсь отобразить больше строк, чем показано в примере (ни одна из них не появилась).

Обновление: я добавил следующую строку -

 && tail -n 10 /var/lib/postgresql/data/postgresql.conf

Она выдаст следующий вывод:

shared_preload_libraries = 'pg_cron'
cron.database_name = 'kardashev'

Над этим должно быть 8 строк (файл конфигурации довольно массивный). Но ничего на выходе. На данный момент файл пуст, и мое создание файла сдувается еще до того, как контейнер действительно запустится. Тьфу. Все еще не понимая, что это значит, хотя я помню кое-что за несколько лет go.

Ответы [ 2 ]

3 голосов
/ 12 марта 2020

Официальный postgres image Dockerfile объявляет

VOLUME /var/lib/postgresql/data

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

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

docker run -d -p 5432:5432 \
  -v pgdata:/var/lib/postgresql/data \
  -v $PWD/postgresql.conf:/var/lib/postgresql/data/postgresql.conf \
  postgres:12.2

(Учитывая, что вам нужно установить дополнительные пакеты, а также изменить файл конфигурации, вам нужно сделать это и создать собственный образ.)

1 голос
/ 12 марта 2020

при выполнении первой части вашего запроса:

docker run --rm postgres:12.2 apt-get install -y postgresql-12-cron

Контейнер возвращает

E: Unable to locate package postgresql-12-cron

и из-за && в конце вашего apt-get ему НУЖНО чтобы преуспеть перед эхом, и если apt-get терпит неудачу, он не выполнит то, что следует после.

Вы должны исправить имя вашего пакета и повторить попытку

Редактировать: пакет существует, но вам нужно ОБНОВИТЬ свои репо в первую очередь. Ваш докер-файл должен выглядеть так:

FROM postgres:12.2

RUN apt-get update \
 && apt-get install -y postgresql-12-cron                     \
 && echo "shared_preload_libraries = 'pg_cron'" >>            \
         /var/lib/postgresql/data/postgresql.conf
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...