Docker swarm выполнить команду в контейнере

Итак, я настраиваю Docker Swarm.

Теперь я спокойно работаю с командой docker stack deploy -c docker-compose.yml myapp, которая заменяет мою прежнюю docker-compose up.

Но один из моих сервисов — это моя БД, и мне нужно pgrestore внутри нее.

Раньше с композицией я запускал:

docker-compose run --rm postgres pg_restore --rest-of-command

Как я могу сделать то же самое с stack deploy?

К сожалению, контейнер, созданный с помощью compose, отличается от контейнера из stack deploy: первый называется myapp_postgres, а второй myapp_postgres.1.zamd6kb6cy4p8mtfha0gn50vh.

Думаю, я мог бы написать что-то вроде docker exec 035803286af0, но тогда я теряю все преимущества конфига от docker-compose.yml, а в данном случае это:

  postgres:
    env_file:
      - ./.env
    image: postgres:11.0-alpine
    volumes:
      - "..:/app" # toe make the dump accessible to the container
      - "/var/run/postgresql:/var/run/postgresql"

Так что это решение не очень IaC.

Так разве там нет docker service run или что-то в этом роде?

Спасибо


person Augustin Riedinger    schedule 28.10.2019    source источник
comment
вы хотите запустить pgrestore при запуске контейнера или вручную после этого?   -  person Ay0    schedule 29.10.2019


Ответы (1)


Вы можете следить за документами образа docker (раздел Сценарии инициализации):

и создайте скрипт *.sh под /docker-entrypoint-initdb.d, который будет запускать pg_restore ..., когда контейнер Postgres будет работать как часть службы Docker.

Это не похоже на прямой ответ на ваш вопрос, однако он может помочь вам восстановить дамп во время инициализации Postgres.

person rok    schedule 28.10.2019
comment
Кажется, я не могу запустить pg_restore на этом этапе... :( stackoverflow.com/a/39275203/1620081 - person Augustin Riedinger; 29.10.2019
comment
Это то, что я в итоге сделал. Если кому-то интересно, могу поделиться своим скриптом. - person Augustin Riedinger; 13.02.2020