Docker postgres не запускается при сборке - PullRequest
0 голосов
/ 25 сентября 2018

Я хочу использовать docker-контейнер для имитации моей производственной среды, поэтому я установил базу данных и сервер в один и тот же контейнер, а не каждый в своем собственном.

Это мой dockerfile:

FROM debian
RUN apt update
RUN apt install postgresql-9.6 tomcat8 tomcat8-admin -y
RUN service postgresql start
RUN service postgresql status # says postgres is down
RUN su - postgres ;
RUN createdb db_example # fails !!!
RUN psql -c "CREATE USER springuser WITH PASSWORD 'test123';"
RUN exit
RUN service tomcat8 start

COPY target/App-1.0.war /var/lib/tomcat8/webapps/

CMD ["/bin/bash"]

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

Спасибо за вашу помощь

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

У меня есть проблема в файле войны локальный хост для базы данных, жестко запрограммированный.
Благодаря Light.G он предложил мне использовать --net = host для контейнера,так что теперь есть один контейнер с базой данных и один с сервером Tomcat.

Это шаги, которые я выполнил.

Создание образа докера

docker build -t $USER/App .

Запуск базы данных postgres

Мы используем пространство имен хоста, невозможно запустить другую программу на post 5432.
Запустить контейнер postgres следующим образом:
docker run -it --rm --net=host -e POSTGRES_USER='springuser' -e POSTGRES_DB='db_example' -e POSTGRES_PASSWORD='test123' postgres

Запустите tomcat

Запустите контейнер приложения с помощью этой команды:
docker run -it --net=host --rm $USER/App

0 голосов
/ 25 сентября 2018

Все рекомендации в комментариях верны, лучше хранить сервисы в разных контейнерах.

Тем не менее, и просто чтобы сообщить вам, проблема в Dockerfile заключается в том, что запуск сервисов в операторах RUN бесполезен.Для каждой строки в Dockerfile docker создает новый образ.Например, RUN service postgresql start, он может запустить postgresql во время сборки Docker, но он не сохраняется в конечном образе.Только файловая система сохраняется от одного шага к другому, а не процессы.

Каждый процесс должен запускаться в точке входа, это единственная команда, которая вызывается при запуске exec docker:

FROM debian
RUN apt update
RUN apt install postgresql-9.6 tomcat8 tomcat8-admin -y

COPY target/App-1.0.war /var/lib/tomcat8/webapps/

ENTRYPOINT["/bin/bash", "-c", "service postgresql start && service postgresql status && createdb db_example && psql -c \"CREATE USER springuser WITH PASSWORD 'test123';\" && service tomcat8 start && sleep infinity"]

(могут возникнуть проблемы с кавычками в команде psql)

...