LINUX.ORG.RU

docker как дождаться готовности контейнера и завершить его

 , ,


0

1

можно как-то, что бы после разворачивания бд дампа через docker-compose или docker, останавливался контейнер?

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

docker-compose самый обычный

version: '2.1'
services:
  db:
   image: postgres:9.6-alpine
   container_name: postgres
   restart: always
   ports:
     - '127.0.0.1:5532:5432'
   environment:
     POSTGRES_USER: ${POSTGRESQL_USER}
     POSTGRES_PASSWORD: ${POSTGRESQL_PASSWORD}
     POSTGRES_DB: ${POSTGRESQL_DATABASE}
   volumes:
     - "/opt/dump/postgres:/docker-entrypoint-initdb.d"
     - "pg_data:/var/lib/postgresql/data"
volumes:
  pg_data:
    driver: local

В cmd или entrypoint помещаешь скрипт, который выполняет нужную работу и завершается, и ставишь restart: no

te111011010 ()
Ответ на: комментарий от te111011010

я взял для примера скрипт


set -e

host="postgres"
port="5432"
cmd="$@"

>&2 echo "!!!!!!!! Check conteiner_a for available !!!!!!!!"

until nc -z -v ${host} ${port}; do
          >&2 echo "Conteiner_A is unavailable - sleeping"
            sleep 1
done

>&2 echo "Conteiner_A is up - executing command"

exec $cmd```

добавил его через 

```volumes:
     - "/opt/dump/entrypoint:/entrypoint"

но не завершается контейнер

Garcia ()
Последнее исправление: Garcia (всего исправлений: 1 )
Ответ на: комментарий от te111011010
version: '2.1'
services:
  db:
   image: postgres:9.6-alpine
   container_name: postgres
   restart: "no"
   ports:
     - '127.0.0.1:5532:5432'
   environment:
     POSTGRES_USER: ${POSTGRESQL_USER}
     POSTGRES_PASSWORD: ${POSTGRESQL_PASSWORD}
     POSTGRES_DB: ${POSTGRESQL_DATABASE}
   volumes:
     - "/opt/dump/entrypoint:/entrypoint"
     - "/opt/dump/postgres:/docker-entrypoint-initdb.d"
     - "pg_data:/var/lib/postgresql/data"
volumes:
  pg_data:
    driver: local

запускаю так - docker-compose up

docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED              STATUS              PORTS                      NAMES
a6a7d6524b32        postgres:9.6-alpine   "docker-entrypoint.s…"   About a minute ago   Up About a minute   127.0.0.1:5532->5432/tcp   postgres
docker logs postgres
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "en_US.utf8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

Data page checksums are disabled.

fixing permissions on existing directory /var/lib/postgresql/data ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default timezone ... UTC
selecting dynamic shared memory implementation ... posix
creating configuration files ... ok
running bootstrap script ... ok
sh: locale: not found
performing post-bootstrap initialization ... No usable system locales were found.
Use the option "--debug" to see details.
ok

WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.
syncing data to disk ... ok

Success. You can now start the database server using:

    pg_ctl -D /var/lib/postgresql/data -l logfile start

waiting for server to start....LOG:  database system was shut down at 2020-05-27 18:13:01 UTC
LOG:  MultiXact member wraparound protections are now enabled
LOG:  database system is ready to accept connections
LOG:  autovacuum launcher started
 done
server started
CREATE DATABASE


/usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/storage_testing.sql.gz
SET
SET
SET
SET
SET
 set_config
------------

(1 row)

SET
SET
SET
SET
CREATE EXTENSION
COMMENT
SET
SET
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
CREATE SEQUENCE
ALTER TABLE
ALTER SEQUENCE
CREATE TABLE
ALTER TABLE
ALTER TABLE
COPY 1
COPY 2078289
 setval
---------
 3510880
(1 row)

COPY 5
ALTER TABLE
ALTER TABLE
ALTER TABLE
CREATE INDEX


waiting for server to shut down....LOG:  received fast shutdown request
LOG:  aborting any active transactions
LOG:  autovacuum launcher shutting down
LOG:  shutting down
...LOG:  database system is shut down
 done
server stopped

PostgreSQL init process complete; ready for start up.

LOG:  database system was shut down at 2020-05-27 18:13:35 UTC
LOG:  MultiXact member wraparound protections are now enabled
LOG:  database system is ready to accept connections
LOG:  autovacuum launcher started
Garcia ()
Ответ на: комментарий от Garcia

entrypoint.sh

set -e
host="postgres"
port="5432"
cmd="$@"
>&2 echo "!!!!!!!! Check conteiner_a for available !!!!!!!!"
until nc -z -v ${host} ${port}; do
          >&2 echo "Conteiner_A is unavailable - sleeping"
            sleep 1
done
>&2 echo "Conteiner_A is up - executing command"
exec $cmd
Garcia ()
Ответ на: комментарий от te111011010

так вот пока не получается, пробую вот так

command: "zcat /docker-entrypoint-initdb.d/storage_testing.sql.gz | psql -U postgres ${POSTGRESQL_DATABASE}"

или надо по другому?

Garcia ()
Ответ на: комментарий от Garcia

Скорее всего (на память не скажу, обязательно ли) нужно

command: sh -c "zcat /docker-entrypoint-initdb.d/storage_testing.sql.gz | psql -U postgres ${POSTGRESQL_DATABASE}"

te111011010 ()
Ответ на: комментарий от te111011010

Зачем вообще что-либо переопределять?

Я делаю в основном так:

  1. Если доступ к СУБД есть по сети и порт проброшен на хост, то можно просто через psql развернуть по ip СУБД внутри докера.

  2. Если доступ давать нельзя или лень, то можно просто залогиниться в консоль контейнера и запустить развертывание дампа.

anonymous ()
Ответ на: комментарий от Garcia

зачем такие сложности?

  1. $ docker run -d ... запускается контейнер с базой данной.
  2. $ a-command to restore datat наполняем его данными.
  3. $ docker stop ... останавливаем контейнер.
ugoday ★★★★★ ()
Ответ на: комментарий от ugoday

в итоге так и сделал, поднял контейнер, развернул дамп, остановил контейнер, заархивировал файлы, но хотелось как-то красиво сделать только через docker-compose

Garcia ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.