Dockerfile не запускает CMD, если ENTRYPOINT не завершен

Я пытаюсь запустить Dockerfile, который запускает PostgreSQL, а затем добавляю к нему несколько таблиц.

Это мой Dockerfile:

FROM postgres:9.6

MAINTAINER [email protected]

USER postgres
ADD ./backup.sql /backup.sql
ADD ./deploy/import_database.sh /import_database.sh

USER root
RUN chmod +x /import_database.sh

USER postgres

ENTRYPOINT ./docker-entrypoint.sh postgres
CMD ./import_database.sh

Точка входа не завершается, потому что на ней работает сервер postgres. Как я могу запустить CMD, например, после 20 секунд запуска ENTRYPOINT, но не закончив ENTRYPOINT?

Является ли это возможным?


person Asier Gomez    schedule 05.07.2017    source источник


Ответы (1)


CMD и ENTRYPOINT работают не так. Я бы рекомендовал прочитать https://docs.docker.com/engine/reference/builder/#understand-how-cmd-and-entrypoint-interact и посмотрите на диаграмму, чтобы лучше понять, как ENTRYPOINT и CMD взаимодействуют друг с другом.

Тем не менее, если все, что вы хотите сделать, это импортировать файл SQL или запустить скрипт во время выполнения, официальный образ PostgreSQL уже поможет вам. См. https://github.com/docker-library/docs/tree/master/postgres#how-to-extend-this-image, чтобы узнать, как это сделать.

Например, в случае вашего Dockerfile (если вы просто хотите импортировать файл SQL) можно сделать что-то вроде:

FROM postgres:9.6
ADD ./backup.sql /docker-entrypoint-initdb.d/backup.sql

При запуске контейнера из образа, построенного на этом Dockerfile, сценарий ENTRYPOINT по умолчанию запустит временный экземпляр PostgreSQL, дождется его готовности, импортирует ваши данные, а затем перезапустится для обслуживания подключений.

person Andy Shinn    schedule 05.07.2017
comment
Большое спасибо!! У меня это работает идеально :), я бы прочитал, как CMD и ENTRYPOINT работают вместе. - person Asier Gomez; 06.07.2017