Compare commits

...

109 Commits

Author SHA1 Message Date
Jose Diaz-Gonzalez
bfc0f18759 Release 1.34.0
Some checks failed
tagged-release / tagged-release (push) Has been cancelled
2023-05-28 01:00:01 -04:00
Jose Diaz-Gonzalez
9df82c58da Release 1.33.2
Some checks failed
tagged-release / tagged-release (push) Has been cancelled
2023-05-27 22:34:06 -04:00
josegonzalez
ee2d2f10f7 Merge pull request #260 from erickedji/master
fix: create ssl certs outside container
2023-05-27 22:33:27 -04:00
josegonzalez
9f3d24ca9f Merge branch 'master' into master 2023-05-27 19:45:41 -04:00
Jose Diaz-Gonzalez
6128801308 Release 1.33.1
Some checks failed
tagged-release / tagged-release (push) Has been cancelled
2023-05-13 12:42:31 -04:00
josegonzalez
8edb644d11 Merge pull request #293 from dokku/dependabot/docker/postgres-15.3
chore(deps): bump postgres from 15.2 to 15.3
2023-05-13 12:42:15 -04:00
dependabot[bot]
3181bb114e chore(deps): bump postgres from 15.2 to 15.3
Bumps postgres from 15.2 to 15.3.

---
updated-dependencies:
- dependency-name: postgres
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-12 02:57:10 +00:00
Jose Diaz-Gonzalez
b722939dbb Release 1.33.0
Some checks failed
tagged-release / tagged-release (push) Has been cancelled
2023-03-19 05:31:06 -04:00
josegonzalez
7b7da09a76 Merge pull request #286 from dokku/dependabot/docker/postgres-15.2
chore(deps): bump postgres from 14.5 to 15.2
2023-03-19 05:30:51 -04:00
Jose Diaz-Gonzalez
17f3ce2188 Release 1.32.0
Some checks failed
tagged-release / tagged-release (push) Has been cancelled
2023-02-25 22:13:17 -05:00
josegonzalez
746b276202 Merge pull request #288 from dokku/error-when-link-exists
Show an error when an ambassador container already exists but we don't have expose configuration
2023-02-25 22:11:57 -05:00
Jose Diaz-Gonzalez
bbc7b0fc71 fix: show an error when an ambassador container already exists but we don't have expose configuration
Closes dokku/dokku-redis#200
2023-02-25 20:10:37 -05:00
dependabot[bot]
f9e5067aa8 chore(deps): bump postgres from 14.5 to 15.2
Bumps postgres from 14.5 to 15.2.

---
updated-dependencies:
- dependency-name: postgres
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-25 07:24:28 +00:00
Jose Diaz-Gonzalez
c4b69d2e17 Release 1.31.0
Some checks failed
tagged-release / tagged-release (push) Has been cancelled
2023-02-25 02:23:25 -05:00
josegonzalez
70265e03a7 Merge pull request #287 from dokku/no-restart-link
Add ability to skip restarts on link and unlink
2023-02-25 02:13:12 -05:00
Jose Diaz-Gonzalez
5500dc41e7 fix: update link docs to remove erroneous copy-paste 2023-02-25 01:50:30 -05:00
Jose Diaz-Gonzalez
5e951257ce tests: link service before unlinking 2023-02-25 00:47:25 -05:00
Jose Diaz-Gonzalez
f4e66990c5 chore: remove extra newline 2023-02-21 00:49:17 -05:00
Jose Diaz-Gonzalez
bceebc1e9c fix: update tests to properly handle case where app is not running 2023-02-21 00:48:22 -05:00
Jose Diaz-Gonzalez
6accb9cbda fix: move arg-less flags to the front 2023-02-21 00:29:30 -05:00
Jose Diaz-Gonzalez
a925fe66de tests: add output/status and flesh out restart tests a bit more 2023-02-21 00:08:53 -05:00
Jose Diaz-Gonzalez
3a03ed7b92 tests: add test for --no-restart to link tests 2023-02-20 23:51:27 -05:00
Jose Diaz-Gonzalez
16fa2b1189 tests: add test for --no-restart to unlink tests 2023-02-20 23:47:03 -05:00
Jose Diaz-Gonzalez
afb21619f6 chore: make all the service names used in the service_unlink tests the same 2023-02-20 23:40:09 -05:00
Jose Diaz-Gonzalez
fb5c34158b chore: make all the service names used in the service_link tests the same 2023-02-20 23:35:12 -05:00
Jose Diaz-Gonzalez
ad22989894 feat: add ability to skip restarts on link and unlink
Refs dokku/dokku-redis#192
2023-02-20 23:26:44 -05:00
Jose Diaz-Gonzalez
d68fee775d Release 1.30.1
Some checks failed
tagged-release / tagged-release (push) Has been cancelled
2023-02-09 03:12:21 -05:00
Jose Diaz-Gonzalez
7922f0582f fix: drop extra files from being included in release 2023-02-09 03:07:31 -05:00
josegonzalez
60869897f0 Merge pull request #284 from dokku/auto-release-tags
feat: automatically create releases from tags
2023-02-09 03:03:08 -05:00
Jose Diaz-Gonzalez
df8f917a04 feat: automatically create releases from tags
This will also include release notes, allowing downstream consumers of plugins to better understand what the release includes.
2023-02-09 03:00:43 -05:00
Jose Diaz-Gonzalez
81cb9b79c5 Release 1.30.0 2023-02-09 00:47:42 -05:00
Jose Diaz-Gonzalez
5ed828bc2d Release 1.28.0 2023-02-09 00:38:49 -05:00
josegonzalez
3c7450b9ce Merge pull request #283 from dokku/alt-network-alias
feat: add network alias that is $SERVICE_NAME.$SERVICE_TYPE
2023-02-09 00:36:27 -05:00
Jose Diaz-Gonzalez
a1090e23dc fix: use network alias when linking to wait container 2023-02-08 23:59:22 -05:00
Jose Diaz-Gonzalez
09f022086a fix: drop extra check and always use the same network alias 2023-02-08 18:30:12 -05:00
Jose Diaz-Gonzalez
5479a2b0c9 refactor: use the same network alias as is used when running :link command
This allows for some degree of parity as the network will now resolve the same for both linked and networked containers.
2023-02-08 17:08:08 -05:00
Jose Diaz-Gonzalez
f68b22116d tests: drop extra alias 2023-02-08 12:41:09 -05:00
Jose Diaz-Gonzalez
768c7ede8d tests: correct the app name in use 2023-02-08 12:24:20 -05:00
Jose Diaz-Gonzalez
91ff698a68 fix: use correct alias for non-initial-network connect calls 2023-02-08 12:08:26 -05:00
Jose Diaz-Gonzalez
00bc6ea144 fix: always use the network alias 2023-02-08 12:06:57 -05:00
Jose Diaz-Gonzalez
44fe34fdfa fix: set correct alias for wait container when not using an initial network 2023-02-08 11:53:45 -05:00
Jose Diaz-Gonzalez
a88e34088d feat: use service name as hostname 2023-02-08 11:01:02 -05:00
Jose Diaz-Gonzalez
18cd825539 feat: add network alias that is $SERVICE_NAME.$SERVICE_TYPE
This alias is in addition to the existing dokku.$SERVICE_TYPE.$SERVICE_NAME network alias that is derived from the hostname.
2023-02-08 11:00:01 -05:00
josegonzalez
e7efcfee63 Merge pull request #282 from dokku/network-flags
feat: add support for network related flags on create, clone, and upgrade
2023-02-08 10:25:57 -05:00
Jose Diaz-Gonzalez
1637ce5f25 tests: ignore case where app is already deleted 2023-02-08 02:22:08 -05:00
Jose Diaz-Gonzalez
530dcdbb31 tests: fix issue where the test app wasn't being removed on test teardown 2023-02-08 02:12:32 -05:00
Jose Diaz-Gonzalez
3b2774a8cc chore: remove extra newline 2023-02-08 01:44:22 -05:00
Jose Diaz-Gonzalez
6dc8e57024 fix: correct imports 2023-02-08 01:42:07 -05:00
Jose Diaz-Gonzalez
07065e9a06 feat: add service container log output on failure to start 2023-02-08 01:21:00 -05:00
Jose Diaz-Gonzalez
ebb5112055 fix: add -N flag to getopts 2023-02-08 00:54:23 -05:00
Jose Diaz-Gonzalez
49e4e4ec23 tests: fix :set tests 2023-02-08 00:41:10 -05:00
Jose Diaz-Gonzalez
9b8ab5667b tests: stop running workflows on push
Also remove unnecessary strategy block from jobs.
2023-02-08 00:38:21 -05:00
Jose Diaz-Gonzalez
c2e2b8af62 tests: also force destroy the lsa service 2023-02-08 00:26:56 -05:00
Jose Diaz-Gonzalez
412f92ddea tests: output the contents of the run command in tests 2023-02-08 00:26:32 -05:00
Jose Diaz-Gonzalez
7f4f4d4782 docs: regenerate README 2023-02-08 00:13:39 -05:00
Jose Diaz-Gonzalez
934d054471 feat: add support for network related flags on create, clone, and upgrade
Also add some tests to cover all the network-related functionality.
2023-02-08 00:03:25 -05:00
Jose Diaz-Gonzalez
d5e9a12d59 fix: add missing source calls 2023-02-07 22:38:51 -05:00
Jose Diaz-Gonzalez
ae5be9ff96 fix: ensure properties are setup on plugin install 2023-02-07 22:25:43 -05:00
Jose Diaz-Gonzalez
f101842fe1 fix: suppress output only if there are no errors 2023-02-07 22:22:24 -05:00
josegonzalez
27e8af869a Merge pull request #277 from dokku/191-network-support
Add custom network support
2023-02-07 19:52:13 -05:00
Jose Diaz-Gonzalez
01242f6f88 feat: add network properties to :info output 2023-02-07 18:34:30 -05:00
Jose Diaz-Gonzalez
b482b2ed8c docs: add example for multiple networks 2023-02-07 18:34:30 -05:00
Jose Diaz-Gonzalez
36cd07ec8b feat: add ability to set multiple, comma-delimited post-create and post-start networks 2023-02-07 18:34:30 -05:00
Jose Diaz-Gonzalez
ae0d21180a feat: add support for attaching to networks after service container creation and start 2023-02-07 18:34:30 -05:00
Jose Diaz-Gonzalez
9a8b835a19 refactor: directly write out the cid file when creating the service container 2023-02-07 18:34:30 -05:00
Jose Diaz-Gonzalez
46ad657eaa fix: correct error message for valid/invalid properties 2023-02-07 18:34:30 -05:00
Jose Diaz-Gonzalez
e041442ffd fix: actually call the :set function and ensure we write properties to the correct namespace 2023-02-07 18:34:30 -05:00
Jose Diaz-Gonzalez
ad9b22837a fix: correct issue with checking if the service container is ready when using an initial-network 2023-02-07 18:34:30 -05:00
Jose Diaz-Gonzalez
434cca5aeb feat: add support for specifying an initial-network property
This network is the network that is associated with the container on creation. If specified, then the bridge network is not attached to the service.

Only a single initial network can be specified at this time.
2023-02-07 18:34:30 -05:00
josegonzalez
45c1b1047b Merge pull request #281 from dokku/dependabot/github_actions/actions/upload-artifact-3
chore(deps): bump actions/upload-artifact from 2 to 3
2023-02-07 18:33:44 -05:00
dependabot[bot]
450648d241 chore(deps): bump actions/upload-artifact from 2 to 3
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 2 to 3.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v2...v3)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-07 23:31:31 +00:00
josegonzalez
a253155e43 Merge pull request #280 from dokku/dependabot/github_actions/actions/setup-python-4
chore(deps): bump actions/setup-python from 2 to 4
2023-02-07 18:14:26 -05:00
josegonzalez
5e5cb373de Merge pull request #279 from dokku/dependabot/github_actions/actions/checkout-3
chore(deps): bump actions/checkout from 2 to 3
2023-02-07 18:14:18 -05:00
dependabot[bot]
db224a5879 chore(deps): bump actions/setup-python from 2 to 4
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 2 to 4.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v2...v4)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-07 23:04:08 +00:00
dependabot[bot]
11584397b1 chore(deps): bump actions/checkout from 2 to 3
Bumps [actions/checkout](https://github.com/actions/checkout) from 2 to 3.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v2...v3)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-07 22:59:03 +00:00
Jose Diaz-Gonzalez
8b04d4d434 feat: upgrade github actions automatically 2023-02-07 17:01:15 -05:00
josegonzalez
3d9fc52c78 Merge pull request #278 from dokku/upgrade-test-os
feat: upgrade test os to ubuntu 20.04
2023-02-07 16:51:17 -05:00
Jose Diaz-Gonzalez
31c2c9724d feat: upgrade test os to ubuntu 20.04 2023-02-07 16:19:10 -05:00
Jose Diaz-Gonzalez
1aae1afe5c Release 1.27.0 2023-02-07 08:19:49 -05:00
josegonzalez
3288779806 Merge pull request #276 from dokku/fix-upgrades
fix: properly support new image and image-version values during plugin upgrades
2023-02-07 07:13:59 -05:00
Jose Diaz-Gonzalez
428e95ef08 fix: properly support new image and image-version values during plugin upgrades
Closes dokku/dokku-mongo#143
Closes dokku/dokku-redis#193
Closes dokku/dokku-redis#195
2023-02-07 06:53:40 -05:00
josegonzalez
0bd701736f Merge pull request #275 from dokku/update-docker-commands
Update docker commands to use DOCKER_BIN
2023-02-07 04:46:22 -05:00
Jose Diaz-Gonzalez
03e4c519f1 refactor: use DOCKER_BIN env var instead of calling docker directly
This will allow us to alias the docker binary with podman for most actions - other than updating running containers.
2023-02-07 03:53:08 -05:00
Jose Diaz-Gonzalez
0c04ad8dcb refactor: use namespaced docker commands for interacting with the docker binary 2023-02-07 03:39:42 -05:00
Jose Diaz-Gonzalez
13eeed1582 refactor: namespace all docker commands in common-functions 2023-02-07 03:31:50 -05:00
Jose Diaz-Gonzalez
b1cc1c7914 Release 1.26.2 2023-02-07 02:46:53 -05:00
Jose Diaz-Gonzalez
8701fe04e2 fix: pull the new docker image when upgrading a service if DOCKER_IMAGE_PULL is not disabled
Refs dokku/dokku-clickhouse#51
2023-02-07 02:45:35 -05:00
Jose Diaz-Gonzalez
d654334225 Release 1.26.1 2023-01-28 16:34:48 -05:00
Jose Diaz-Gonzalez
409cd36b63 docs: update the ci workflow badge
Refs https://github.com/badges/shields/issues/8671
2023-01-28 16:32:52 -05:00
josegonzalez
5a181a6a4c Merge pull request #271 from dokku/5468-dokku-lib-host-root
feat: respect DOKKU_LIB_HOST_ROOT for mounted data volumes
2022-12-27 00:22:59 -05:00
Jose Diaz-Gonzalez
077aa4dc11 feat: respect DOKKU_LIB_HOST_ROOT for mounted data volumes
This change allows folks to change where dokku mounts data from for all official plugins, removing the need to specify the configuration on a one-off basis.

Refs dokku/dokku#5468
2022-12-26 23:49:28 -05:00
Jose Diaz-Gonzalez
6ebdb98ac8 Release 1.26.0 2022-12-26 19:02:25 -05:00
josegonzalez
b7e092db39 Merge pull request #270 from dokku/pause-stop-rm
Add :pause subcommand and make :stop subcommand actually remove the container
2022-12-26 18:44:39 -05:00
Jose Diaz-Gonzalez
3f338c7985 feat: add :pause subcommand and make :stop subcommand actually remove the container 2022-12-26 18:21:10 -05:00
Jose Diaz-Gonzalez
1cde514fba docs: update readme 2022-12-26 17:27:30 -05:00
Jose Diaz-Gonzalez
d281d63afb Release 1.25.0 2022-10-12 01:28:19 -04:00
Jose Diaz-Gonzalez
535bbd839f Merge pull request #257 from dokku/dependabot/docker/postgres-14.5
chore(deps): bump postgres from 14.4 to 14.5
2022-10-11 21:46:51 -07:00
Jose Diaz-Gonzalez
1c4d20cd18 Merge pull request #262 from dokku/arm-support
Update all related images to add arm/arm64 support
2022-10-11 21:45:48 -07:00
Jose Diaz-Gonzalez
90f6f1db08 feat: update all related images to add arm/arm64 support 2022-10-11 23:59:25 -04:00
Komlan KEDJI
09926fbecd fix: create ssl certs outside container
This enables support for alpine-based images like timescaledb (no bash/openssl).

Fixes #153
Fixes timescale/timescaledb-docker#99
2022-09-04 09:37:10 +00:00
dependabot[bot]
f0c5009e1a chore(deps): bump postgres from 14.4 to 14.5
Bumps postgres from 14.4 to 14.5.

---
updated-dependencies:
- dependency-name: postgres
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-12 02:07:29 +00:00
Jose Diaz-Gonzalez
674d10ea4d Release 1.24.0 2022-07-25 01:31:15 -04:00
Jose Diaz-Gonzalez
4e3a77ab0e feat: add method for listing all plugin services
This will allow other plugins to iterate over the services exposed by a plugin and instantiate whatever is necessary for those services.
2022-07-25 01:30:32 -04:00
Jose Diaz-Gonzalez
4ea17b07dc Release 1.23.0 2022-07-25 01:17:26 -04:00
Jose Diaz-Gonzalez
d5a4cddc3f chore: run shfmt 2022-07-25 01:15:32 -04:00
Jose Diaz-Gonzalez
2909ba7a9b Merge pull request #256 from dokku/filter-services
fix: refactor how services are filtered
2022-07-25 01:12:09 -04:00
Jose Diaz-Gonzalez
307f5d7378 fix: update clone test 2022-07-25 00:37:04 -04:00
Jose Diaz-Gonzalez
9cf8a5880f fix: refactor how services are filtered
The previous method did not include the service type in the user-auth-service hook, which meant it was kinda guess/check as to whether a datastore was filtered correctly for the service in question.

Additionally, we now handle newlines correctly, ensuring that when there _is_ filtering, we treat each datastore as a distinct one.
2022-07-24 23:53:47 -04:00
Jose Diaz-Gonzalez
63eb33d99c fix: move warning below service name verification 2022-07-19 01:34:21 -04:00
65 changed files with 974 additions and 254 deletions

View File

@@ -18,7 +18,7 @@ main() {
# built in the Dockerfile
PLUGIN_NAME="$(source /tmp/.env && echo "$PLUGIN_NAME")"
PLUGIN_VARIABLE="$(source /tmp/.env && echo "$PLUGIN_VARIABLE")"
echo "export ${PLUGIN_VARIABLE}_HOST_ROOT=${SERVICE_HOST_ROOT}/$PLUGIN_NAME" > /etc/default/dokku
echo "export ${PLUGIN_VARIABLE}_HOST_ROOT=${SERVICE_HOST_ROOT}/$PLUGIN_NAME" >/etc/default/dokku
}
main "$@"
main "$@"

View File

@@ -1,6 +1,12 @@
---
version: 2
updates:
- package-ecosystem: "docker"
directory: "/"
schedule:
interval: "daily"
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: daily
open-pull-requests-limit: 10

View File

@@ -10,21 +10,23 @@ on:
branches:
- master
concurrency:
group: build-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
unit-tests-master:
name: unit-tests
runs-on: ubuntu-18.04
strategy:
fail-fast: true
runs-on: ubuntu-20.04
env:
DOKKU_VERSION: master
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
with:
fetch-depth: 0
- uses: actions/setup-python@v2
- uses: actions/setup-python@v4
with:
python-version: '3.7.x'
@@ -49,7 +51,7 @@ jobs:
- run: make test
- uses: actions/upload-artifact@v2
- uses: actions/upload-artifact@v3
if: failure()
with:
name: tmp/test-results
@@ -57,18 +59,16 @@ jobs:
unit-tests-0_19_0:
name: unit-tests-0.19.0
runs-on: ubuntu-18.04
strategy:
fail-fast: true
runs-on: ubuntu-20.04
env:
DOKKU_TAG: v0.19.0
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
with:
fetch-depth: 0
- uses: actions/setup-python@v2
- uses: actions/setup-python@v4
with:
python-version: '3.7.x'
@@ -93,7 +93,7 @@ jobs:
- run: make test
- uses: actions/upload-artifact@v2
- uses: actions/upload-artifact@v3
if: failure()
with:
name: tmp/test-results

19
.github/workflows/tagged-release.yml vendored Normal file
View File

@@ -0,0 +1,19 @@
---
name: "tagged-release"
# yamllint disable-line rule:truthy
on:
push:
tags:
- '*'
jobs:
tagged-release:
name: tagged-release
runs-on: ubuntu-20.04
steps:
- uses: "marvinpinto/action-automatic-releases@v1.2.1"
with:
repo_token: "${{ secrets.GITHUB_TOKEN }}"
prerelease: false

View File

@@ -1 +1 @@
FROM postgres:14.4
FROM postgres:15.3

View File

@@ -1,6 +1,6 @@
# dokku postgres [![Build Status](https://img.shields.io/github/workflow/status/dokku/dokku-postgres/CI/master?style=flat-square "Build Status")](https://github.com/dokku/dokku-postgres/actions/workflows/ci.yml?query=branch%3Amaster) [![IRC Network](https://img.shields.io/badge/irc-libera-blue.svg?style=flat-square "IRC Libera")](https://webchat.libera.chat/?channels=dokku)
# dokku postgres [![Build Status](https://img.shields.io/github/actions/workflow/status/dokku/dokku-postgres/ci.yml?branch=master&style=flat-square "Build Status")](https://github.com/dokku/dokku-postgres/actions/workflows/ci.yml?query=branch%3Amaster) [![IRC Network](https://img.shields.io/badge/irc-libera-blue.svg?style=flat-square "IRC Libera")](https://webchat.libera.chat/?channels=dokku)
Official postgres plugin for dokku. Currently defaults to installing [postgres 14.4](https://hub.docker.com/_/postgres/).
Official postgres plugin for dokku. Currently defaults to installing [postgres 15.3](https://hub.docker.com/_/postgres/).
## Requirements
@@ -41,8 +41,10 @@ postgres:linked <service> <app> # check if the postgres servi
postgres:links <service> # list all apps linked to the postgres service
postgres:list # list all postgres services
postgres:logs <service> [-t|--tail] <tail-num-optional> # print the most recent log(s) for this service
postgres:pause <service> # pause a running postgres service
postgres:promote <service> <app> # promote service <service> as DATABASE_URL in <app>
postgres:restart <service> # graceful shutdown and restart of the postgres service container
postgres:set <service> <key> <value> # set or clear a property for a service
postgres:start <service> # start a previously stopped postgres service
postgres:stop <service> # stop a running postgres service
postgres:unexpose <service> # unexpose a previously exposed postgres service
@@ -70,8 +72,11 @@ flags:
- `-i|--image IMAGE`: the image name to start the service with
- `-I|--image-version IMAGE_VERSION`: the image version to start the service with
- `-m|--memory MEMORY`: container memory limit in megabytes (default: unlimited)
- `-N|--initial-network INITIAL_NETWORK`: the initial network to attach the service to
- `-p|--password PASSWORD`: override the user-level service password
- `-P|--post-create-network NETWORKS`: a comman-separated list of networks to attach the service container to after service creation
- `-r|--root-password PASSWORD`: override the root-level service password
- `-S|--post-start-network NETWORKS`: a comman-separated list of networks to attach the service container to after service start
- `-s|--shm-size SHM_SIZE`: override shared memory size for postgres docker container
Create a postgres service named lollipop:
@@ -95,7 +100,7 @@ export POSTGRES_CUSTOM_ENV="USER=alpha;HOST=beta"
dokku postgres:create lollipop
```
Official Postgres docker images does not include postgis extension (amongst others). The following example creates a new postgres service using `postgis/postgis:13-3.1` image, which includes the `postgis` extension.
Official Postgres "$DOCKER_BIN" image ls does not include postgis extension (amongst others). The following example creates a new postgres service using `postgis/postgis:13-3.1` image, which includes the `postgis` extension.
```shell
dokku postgres:create postgis-database --image "postgis/postgis" --image-version "13-3.1"
@@ -116,7 +121,10 @@ flags:
- `--exposed-ports`: show service exposed ports
- `--id`: show the service container id
- `--internal-ip`: show the service internal ip
- `--initial-network`: show the initial network being connected to
- `--links`: show the service app links
- `--post-create-network`: show the networks to attach to after service container creation
- `--post-start-network`: show the networks to attach to after service container start
- `--service-root`: show the service root directory
- `--status`: show the service running status
- `--version`: show the service image version
@@ -136,7 +144,10 @@ dokku postgres:info lollipop --dsn
dokku postgres:info lollipop --exposed-ports
dokku postgres:info lollipop --id
dokku postgres:info lollipop --internal-ip
dokku postgres:info lollipop --initial-network
dokku postgres:info lollipop --links
dokku postgres:info lollipop --post-create-network
dokku postgres:info lollipop --post-start-network
dokku postgres:info lollipop --service-root
dokku postgres:info lollipop --status
dokku postgres:info lollipop --version
@@ -195,6 +206,7 @@ flags:
- `-a|--alias "BLUE_DATABASE"`: an alternative alias to use for linking to an app via environment variable
- `-q|--querystring "pool=5"`: ampersand delimited querystring arguments to append to the service link
- `-n|--no-restart "false"`: whether or not to restart the app on link (default: true)
A postgres service can be linked to a container. This will use native docker links via the docker-options plugin. Here we link it to our `playground` app.
@@ -247,6 +259,10 @@ postgres2://lollipop:SOME_PASSWORD@dokku-postgres-lollipop:5432/lollipop
dokku postgres:unlink <service> <app>
```
flags:
- `-n|--no-restart "false"`: whether or not to restart the app on unlink (default: true)
You can unlink a postgres service:
> NOTE: this will restart your app and unset related environment variables
@@ -255,6 +271,31 @@ You can unlink a postgres service:
dokku postgres:unlink lollipop playground
```
### set or clear a property for a service
```shell
# usage
dokku postgres:set <service> <key> <value>
```
Set the network to attach after the service container is started:
```shell
dokku postgres:set lollipop post-create-network custom-network
```
Set multiple networks:
```shell
dokku postgres:set lollipop post-create-network custom-network,other-network
```
Unset the post-create-network value:
```shell
dokku postgres:set lollipop post-create-network
```
### Service Lifecycle
The lifecycle of each service can be managed through the following commands:
@@ -376,12 +417,25 @@ dokku postgres:start lollipop
dokku postgres:stop <service>
```
Stop the service and the running container:
Stop the service and removes the running container:
```shell
dokku postgres:stop lollipop
```
### pause a running postgres service
```shell
# usage
dokku postgres:pause <service>
```
Pause the running container for the service:
```shell
dokku postgres:pause lollipop
```
### graceful shutdown and restart of the postgres service container
```shell
@@ -408,7 +462,10 @@ flags:
- `-C|--custom-env "USER=alpha;HOST=beta"`: semi-colon delimited environment variables to start the service with
- `-i|--image IMAGE`: the image name to start the service with
- `-I|--image-version IMAGE_VERSION`: the image version to start the service with
- `-R|--restart-apps "true"`: whether to force an app restart
- `-N|--initial-network INITIAL_NETWORK`: the initial network to attach the service to
- `-P|--post-create-network NETWORKS`: a comman-separated list of networks to attach the service container to after service creation
- `-R|--restart-apps "true"`: whether or not to force an app restart (default: false)
- `-S|--post-start-network NETWORKS`: a comman-separated list of networks to attach the service container to after service start
- `-s|--shm-size SHM_SIZE`: override shared memory size for postgres docker container
You can upgrade an existing service to a new image or image-version:
@@ -479,8 +536,11 @@ flags:
- `-i|--image IMAGE`: the image name to start the service with
- `-I|--image-version IMAGE_VERSION`: the image version to start the service with
- `-m|--memory MEMORY`: container memory limit in megabytes (default: unlimited)
- `-N|--initial-network INITIAL_NETWORK`: the initial network to attach the service to
- `-p|--password PASSWORD`: override the user-level service password
- `-P|--post-create-network NETWORKS`: a comman-separated list of networks to attach the service container to after service creation
- `-r|--root-password PASSWORD`: override the root-level service password
- `-S|--post-start-network NETWORKS`: a comman-separated list of networks to attach the service container to after service start
- `-s|--shm-size SHM_SIZE`: override shared memory size for postgres docker container
You can clone an existing service to a new one:
@@ -722,8 +782,8 @@ Remove the scheduled backup from cron:
dokku postgres:backup-unschedule lollipop
```
### Disabling `docker pull` calls
### Disabling `docker image pull` calls
If you wish to disable the `docker pull` calls that the plugin triggers, you may set the `POSTGRES_DISABLE_PULL` environment variable to `true`. Once disabled, you will need to pull the service image you wish to deploy as shown in the `stderr` output.
If you wish to disable the `docker image pull` calls that the plugin triggers, you may set the `POSTGRES_DISABLE_PULL` environment variable to `true`. Once disabled, you will need to pull the service image you wish to deploy as shown in the `stderr` output.
Please ensure the proper images are in place when `docker pull` is disabled.
Please ensure the proper images are in place when `docker image pull` is disabled.

2
Vagrantfile vendored
View File

@@ -1,7 +1,7 @@
# -*- mode: ruby -*-
# vi: set ft=ruby :
BOX_NAME = ENV["BOX_NAME"] || "bento/ubuntu-18.04"
BOX_NAME = ENV["BOX_NAME"] || "bento/ubuntu-20.04"
BOX_MEMORY = ENV["BOX_MEMORY"] || "2048"
DOKKU_VERSION = "master"

View File

@@ -35,7 +35,7 @@ def header(service):
return " ".join(
[
f"# dokku {service}",
f'[![Build Status](https://img.shields.io/github/workflow/status/dokku/dokku-{service}/CI/master?style=flat-square "Build Status")](https://github.com/dokku/dokku-{service}/actions/workflows/ci.yml?query=branch%3Amaster)',
f'[![Build Status](https://img.shields.io/github/actions/workflow/status/dokku/dokku-{service}/ci.yml?branch=master&style=flat-square "Build Status")](https://github.com/dokku/dokku-{service}/actions/workflows/ci.yml?query=branch%3Amaster)',
f'[![IRC Network](https://img.shields.io/badge/irc-libera-blue.svg?style=flat-square "IRC Libera")](https://webchat.libera.chat/?channels=dokku)',
]
)
@@ -131,7 +131,7 @@ def usage_section(service, variable, alias, image, scheme, ports, options, unimp
def usage_intro(service, variable, alias, image, scheme, ports, options, unimplemented):
commands = ["create", "info", "list", "logs", "link", "unlink"]
commands = ["create", "info", "list", "logs", "link", "unlink", "set"]
content = ["### Basic Usage"]
return fetch_commands_content(
@@ -148,6 +148,7 @@ def usage_lifecycle(service, variable, alias, image, scheme, ports, options, uni
"promote",
"start",
"stop",
"pause",
"restart",
"upgrade",
]
@@ -222,11 +223,11 @@ def usage_docker_pull(service, variable, alias, image, scheme, ports, options, u
service_prefix = service.upper()
return "\n".join(
[
"### Disabling `docker pull` calls",
"### Disabling `docker image pull` calls",
"",
f"If you wish to disable the `docker pull` calls that the plugin triggers, you may set the `{service_prefix}_DISABLE_PULL` environment variable to `true`. Once disabled, you will need to pull the service image you wish to deploy as shown in the `stderr` output.",
f"If you wish to disable the `docker image pull` calls that the plugin triggers, you may set the `{service_prefix}_DISABLE_PULL` environment variable to `true`. Once disabled, you will need to pull the service image you wish to deploy as shown in the `stderr` output.",
"",
"Please ensure the proper images are in place when `docker pull` is disabled.",
"Please ensure the proper images are in place when `docker image pull` is disabled.",
]
)

View File

@@ -2,6 +2,7 @@
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/config"
[[ " help $PLUGIN_COMMAND_PREFIX:help $PLUGIN_COMMAND_PREFIX $PLUGIN_COMMAND_PREFIX:default " == *" $1 "* ]] || [[ "$1" == "$PLUGIN_COMMAND_PREFIX:"* ]] || exit "$DOKKU_NOT_IMPLEMENTED_EXIT"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x

View File

@@ -2,6 +2,7 @@
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/config"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_CORE_AVAILABLE_PATH/common/property-functions"
source "$PLUGIN_AVAILABLE_PATH/config/functions"
add_to_links_file() {
@@ -38,7 +39,7 @@ auth_service_filter() {
# this plugin trigger exists in the core `20_events` plugin
if [[ "$user_auth_count" == 1 ]] && [[ -f "$PLUGIN_PATH"/enabled/20_events/user-auth-service ]]; then
# echo out all the services since there is no valid plugin trigger
# echo out all the services since there is no valid plugin trigger
for SERVICE in "${SERVICES[@]}"; do
[[ -n "$SERVICE" ]] && echo "$SERVICE"
done
@@ -48,27 +49,36 @@ auth_service_filter() {
export SSH_USER=${SSH_USER:=$USER}
export SSH_NAME=${NAME:="default"}
# the output of this trigger should be all the services a user has access to
plugn trigger user-auth-service "$SSH_USER" "$SSH_NAME" "${SERVICES[@]}"
plugn trigger user-auth-service "$SSH_USER" "$SSH_NAME" "$PLUGIN_COMMAND_PREFIX" "${SERVICES[@]}"
}
fn-services-list() {
declare desc="prints a filtered list of all local apps"
declare FILTER="$1"
local detected_services filtered_services services
local services=()
pushd "$PLUGIN_DATA_ROOT" >/dev/null
for f in *; do
[[ -d $f ]] || continue
services+=("$f")
done
popd >/dev/null 2>&1 || pushd "/tmp" >/dev/null
if [[ "${#services[@]}" -eq 0 ]]; then
return
fi
local detected_services=("$(ls "$PLUGIN_DATA_ROOT" 2>/dev/null)")
if [[ "$FILTER" == "false" ]]; then
for service in "${detected_services[@]}"; do
if [[ -n "$service" ]]; then
for service in "${services[@]}"; do
if [[ -n "$service" ]]; then
echo "$service"
fi
done
return
fi
filtered_services="$(auth_service_filter "${detected_services[@]}" 2>/dev/null)"
for service in "$filtered_services"; do
if [[ -n "$service" ]]; then
for service in $(auth_service_filter "${services[@]}" 2>/dev/null); do
if [[ -n "$service" ]]; then
echo "$service"
fi
done
@@ -85,7 +95,7 @@ docker_ports_options() {
get_container_ip() {
declare desc="retrieve the ip address of a container"
declare CONTAINER_ID="$1"
docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$CONTAINER_ID" 2>/dev/null
"$DOCKER_BIN" container inspect --format '{{ .NetworkSettings.IPAddress }}' "$CONTAINER_ID" 2>/dev/null
}
get_database_name() {
@@ -94,7 +104,7 @@ get_database_name() {
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
if [[ ! -f "$SERVICE_ROOT/DATABASE_NAME" ]]; then
echo "$SERVICE" > "$SERVICE_ROOT/DATABASE_NAME"
echo "$SERVICE" >"$SERVICE_ROOT/DATABASE_NAME"
fi
cat "$SERVICE_ROOT/DATABASE_NAME"
@@ -144,7 +154,7 @@ is_container_status() {
declare desc="return 0 or 1 depending upon whether a given container has a certain status"
declare CID="$1" STATUS="$2"
local TEMPLATE="{{.State.$STATUS}}"
local CONTAINER_STATUS=$(docker inspect -f "$TEMPLATE" "$CID" 2>/dev/null || true)
local CONTAINER_STATUS=$("$DOCKER_BIN" container inspect -f "$TEMPLATE" "$CID" 2>/dev/null || true)
if [[ "$CONTAINER_STATUS" == "true" ]]; then
return 0
@@ -199,7 +209,7 @@ retry-docker-command() {
local i=0 success=false
until [ $i -ge 100 ]; do
set +e
suppress_output docker exec "$ID" sh -c "$COMMAND"
suppress_output "$DOCKER_BIN" container exec "$ID" sh -c "$COMMAND"
exit_code=$?
set -e
if [[ "$exit_code" == 0 ]]; then
@@ -237,8 +247,7 @@ service_app_links() {
declare APP="$1"
local LINKED_APP SERVICE SERVICE_ROOT
pushd "$PLUGIN_DATA_ROOT" >/dev/null
for SERVICE in $(fn-services-list); do
for SERVICE in $(fn-services-list true); do
[[ -n "$SERVICE" ]] || continue
SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
@@ -273,7 +282,7 @@ service_backup() {
BACKUP_TMPDIR=$(mktemp -d --tmpdir)
trap 'rm -rf "$BACKUP_TMPDIR" > /dev/null' RETURN INT TERM EXIT
docker inspect "$ID" &>/dev/null || dokku_log_fail "Service container does not exist"
"$DOCKER_BIN" container inspect "$ID" >/dev/null 2>&1 || dokku_log_fail "Service container does not exist"
is_container_status "$ID" "Running" || dokku_log_fail "Service container is not running"
(service_export "$SERVICE" >"${BACKUP_TMPDIR}/export")
@@ -300,7 +309,7 @@ service_backup() {
fi
# shellcheck disable=SC2086
docker run --rm $BACKUP_PARAMETERS "$PLUGIN_S3BACKUP_IMAGE"
"$DOCKER_BIN" container run --rm $BACKUP_PARAMETERS "$PLUGIN_S3BACKUP_IMAGE"
}
service_commit_config() {
@@ -309,7 +318,6 @@ service_commit_config() {
local CONFIG_VARIABLE="${PLUGIN_VARIABLE}_CONFIG_OPTIONS"
local ENV_VARIABLE="${PLUGIN_VARIABLE}_CUSTOM_ENV"
custom_env="${!ENV_VARIABLE}"
[[ -n "$SERVICE_CUSTOM_ENV" ]] && custom_env="$SERVICE_CUSTOM_ENV"
if [[ -n $custom_env ]]; then
@@ -341,6 +349,18 @@ service_commit_config() {
if [[ -n "$PLUGIN_IMAGE_VERSION" ]]; then
echo "$PLUGIN_IMAGE_VERSION" >"$SERVICE_ROOT/IMAGE_VERSION"
fi
if [[ -n "$SERVICE_INITIAL_NETWORK" ]]; then
fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "initial-network" "$SERVICE_INITIAL_NETWORK"
fi
if [[ -n "$SERVICE_POST_CREATE_NETWORK" ]]; then
fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "post-create-network" "$SERVICE_POST_CREATE_NETWORK"
fi
if [[ -n "$SERVICE_POST_START_NETWORK" ]]; then
fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "post-start-network" "$SERVICE_POST_START_NETWORK"
fi
}
service_backup_auth() {
@@ -436,16 +456,16 @@ service_container_rm() {
local SERVICE_NAME="$(get_service_name "$SERVICE")"
local ID
service_stop "$SERVICE"
ID=$(docker ps -aq --no-trunc --filter "name=^/$SERVICE_NAME$" --format '{{ .ID }}') || true
service_pause "$SERVICE"
ID=$("$DOCKER_BIN" container ps -aq --no-trunc --filter "name=^/$SERVICE_NAME$") || true
# this may be 'true' in tests...
if [[ -z "$ID" ]] || [[ "$ID" == "true" ]]; then
return 0
fi
dokku_log_verbose_quiet "Removing container"
docker update --restart=no "$SERVICE_NAME" >/dev/null 2>&1
if ! docker rm "$SERVICE_NAME" >/dev/null 2>&1; then
"$DOCKER_BIN" container update --restart=no "$SERVICE_NAME" >/dev/null 2>&1
if ! "$DOCKER_BIN" container rm "$SERVICE_NAME" >/dev/null 2>&1; then
dokku_log_fail "Unable to remove container for service $SERVICE"
fi
}
@@ -463,13 +483,13 @@ service_enter() {
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local ID="$(cat "$SERVICE_ROOT/ID")"
docker inspect "$ID" &>/dev/null || dokku_log_fail "Service container does not exist"
"$DOCKER_BIN" container inspect "$ID" >/dev/null 2>&1 || dokku_log_fail "Service container does not exist"
is_container_status "$ID" "Running" || dokku_log_fail "Service container is not running"
local EXEC_CMD=""
has_tty && local DOKKU_RUN_OPTS+=" -i -t"
# shellcheck disable=SC2086
docker exec $DOKKU_RUN_OPTS $ID $EXEC_CMD "${@:-/bin/bash}"
"$DOCKER_BIN" container exec $DOKKU_RUN_OPTS $ID $EXEC_CMD "${@:-/bin/bash}"
}
service_exists() {
@@ -494,15 +514,21 @@ service_exposed_ports() {
service_image_exists() {
declare desc="check if the current image exists"
declare SERVICE="$1"
declare SERVICE="$1" PLUGIN_IMAGE="${2:-$PLUGIN_IMAGE}" PLUGIN_IMAGE_VERSION="${3:-$PLUGIN_IMAGE_VERSION}"
local plugin_image="$PLUGIN_IMAGE"
local plugin_image_version="$PLUGIN_IMAGE_VERSION"
[[ -f "$SERVICE_ROOT/IMAGE" ]] && plugin_image="$(cat "$SERVICE_ROOT/IMAGE")"
[[ -f "$SERVICE_ROOT/IMAGE_VERSION" ]] && plugin_image_version="$(cat "$SERVICE_ROOT/IMAGE_VERSION")"
if [[ -z "$PLUGIN_IMAGE" ]] && [[ -f "$SERVICE_ROOT/IMAGE" ]]; then
plugin_image="$(cat "$SERVICE_ROOT/IMAGE")"
fi
if [[ -z "$PLUGIN_IMAGE_VERSION" ]] && [[ -f "$SERVICE_ROOT/IMAGE_VERSION" ]]; then
plugin_image_version="$(cat "$SERVICE_ROOT/IMAGE_VERSION")"
fi
local IMAGE="$plugin_image:$plugin_image_version"
if [[ "$(docker images -q "$IMAGE" 2>/dev/null)" == "" ]]; then
if [[ "$("$DOCKER_BIN" image ls -q "$IMAGE" 2>/dev/null)" == "" ]]; then
return 1
fi
@@ -526,7 +552,10 @@ service_info() {
"--exposed-ports: $(service_exposed_ports "$SERVICE")"
"--id: ${SERVICE_CONTAINER_ID}"
"--internal-ip: $(get_container_ip "${SERVICE_CONTAINER_ID}")"
"--initial-network: $(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "initial-network")"
"--links: $(service_linked_apps "$SERVICE")"
"--post-create-network: $(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "post-create-network")"
"--post-start-network: $(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "post-start-network")"
"--service-root: ${SERVICE_ROOT}"
"--status: $(service_status "$SERVICE")"
"--version: $(service_version "$SERVICE")"
@@ -602,8 +631,9 @@ service_link() {
fi
[[ -n "$SERVICE_QUERYSTRING" ]] && SERVICE_URL="${SERVICE_URL}?${SERVICE_QUERYSTRING}"
plugn trigger service-action post-link "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "$APP"
if [[ "$DOKKU_GLOBAL_FLAGS" == *"--no-restart"* ]]; then
if [[ "$DOKKU_GLOBAL_FLAGS" == *"--no-restart"* ]] || [[ "$SERVICE_RESTART_APPS" == "false" ]]; then
config_set --no-restart "$APP" "${ALIAS}_URL=$SERVICE_URL"
dokku_log_verbose "Skipping restart of linked app"
else
config_set "$APP" "${ALIAS}_URL=$SERVICE_URL"
fi
@@ -637,7 +667,7 @@ service_links() {
service_list() {
declare desc="list all services and their status"
services=("$(fn-services-list true)")
mapfile -t services < <(fn-services-list true)
if [[ "${#services[@]}" -eq 0 ]] || [[ -z "$services" ]]; then
dokku_log_warn "There are no $PLUGIN_SERVICE services"
return
@@ -645,7 +675,7 @@ service_list() {
dokku_log_info2_quiet "$PLUGIN_SERVICE services"
for service in "${services[@]}"; do
echo "$service"
echo "${service}"
done
}
@@ -661,11 +691,11 @@ service_logs() {
DOKKU_LOGS_ARGS+=" --follow"
fi
docker inspect "$ID" &>/dev/null || dokku_log_fail "Service container does not exist"
"$DOCKER_BIN" container inspect "$ID" >/dev/null 2>&1 || dokku_log_fail "Service container does not exist"
is_container_status "$ID" "Running" || dokku_log_warn "Service logs may not be output as service is not running"
# shellcheck disable=SC2086
docker logs $DOKKU_LOGS_ARGS "$ID" 2>&1
"$DOCKER_BIN" container logs $DOKKU_LOGS_ARGS "$ID" 2>&1
}
service_parse_args() {
@@ -682,9 +712,13 @@ service_parse_args() {
"--custom-env") set -- "$@" "-C" ;;
"--database") set -- "$@" "-d" ;;
"--image-version") set -- "$@" "-I" ;;
"--initial-network") set -- "$@" "-N" ;;
"--image") set -- "$@" "-i" ;;
"--memory") set -- "$@" "-m" ;;
"--no-restart") set -- "$@" "-n" ;;
"--password") set -- "$@" "-p" ;;
"--post-create-network") set -- "$@" "-P" ;;
"--post-start-network") set -- "$@" "-S" ;;
"--querystring") set -- "$@" "-q" ;;
"--restart-apps") set -- "$@" "-R" ;;
"--root-password") set -- "$@" "-r" ;;
@@ -695,7 +729,7 @@ service_parse_args() {
done
OPTIND=1
while getopts "a:c:C:d:i:I:m:p:q:R:r:s:u:" opt; do
while getopts "na:c:C:d:i:I:m:n:N:p:P:q:R:r:s:S:u:" opt; do
case "$opt" in
a)
SERVICE_ALIAS="${OPTARG^^}"
@@ -719,9 +753,18 @@ service_parse_args() {
m)
export SERVICE_MEMORY=$OPTARG
;;
n)
export SERVICE_RESTART_APPS=false
;;
N)
export SERVICE_INITIAL_NETWORK=$OPTARG
;;
p)
export SERVICE_PASSWORD=$OPTARG
;;
P)
export SERVICE_POST_CREATE_NETWORK=$OPTARG
;;
q)
export SERVICE_QUERYSTRING=${OPTARG#"?"}
;;
@@ -734,6 +777,9 @@ service_parse_args() {
s)
export SERVICE_SHM_SIZE=$OPTARG
;;
S)
export SERVICE_POST_START_NETWORK=$OPTARG
;;
u)
export SERVICE_USER=$OPTARG
;;
@@ -764,39 +810,36 @@ service_root_password() {
service_port_expose() {
declare desc="wrapper for exposing service ports"
declare SERVICE="$1"
service_start "$SERVICE" "true"
service_port_unpause "$SERVICE" "true" "${@:2}"
}
service_port_pause() {
declare desc="pause service exposure"
declare SERVICE="$1" LOG_FAIL="$2"
declare SERVICE="$1" PORTS=(${@:2})
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local EXPOSED_NAME="$(get_service_name "$SERVICE").ambassador"
local PORT_FILE="$SERVICE_ROOT/PORT"
local SERVICE_NAME="$(get_service_name "$SERVICE")"
local EXPOSED_NAME="$SERVICE_NAME.ambassador"
if [[ "$LOG_FAIL" == "true" ]]; then
[[ ! -f "$PORT_FILE" ]] && dokku_log_fail "Service not exposed"
else
[[ ! -f "$PORT_FILE" ]] && return 0
if [[ ${#PORTS[@]} -eq 0 ]]; then
# shellcheck disable=SC2206
PORTS=(${PORTS[@]:-$(get_random_ports ${#PLUGIN_DATASTORE_PORTS[@]})})
fi
local GREP_NAME="^/${EXPOSED_NAME}$"
local CONTAINER_NAME="$(docker ps -f name="$GREP_NAME" --format "{{.Names}}")"
if [[ -z "$CONTAINER_NAME" ]]; then
if [[ "$LOG_FAIL" == "true" ]]; then
dokku_log_info1 "Service $SERVICE unexposed"
fi
[[ "${#PORTS[@]}" != "${#PLUGIN_DATASTORE_PORTS[@]}" ]] && dokku_log_fail "${#PLUGIN_DATASTORE_PORTS[@]} ports to be exposed need to be provided in the following order: ${PLUGIN_DATASTORE_PORTS[*]}"
return
if [[ -s "$PORT_FILE" ]]; then
# shellcheck disable=SC2207
PORTS=($(cat "$PORT_FILE"))
dokku_log_fail "Service $SERVICE already exposed on port(s) ${PORTS[*]}"
fi
docker stop "$EXPOSED_NAME" >/dev/null 2>&1 || true
docker rm "$EXPOSED_NAME" >/dev/null 2>&1 || true
if [[ "$LOG_FAIL" == "true" ]]; then
dokku_log_info1 "Service $SERVICE unexposed"
if "$DOCKER_BIN" container inspect "$EXPOSED_NAME" >/dev/null 2>&1; then
dokku_log_warn "Service $SERVICE has an untracked expose container, removing"
"$DOCKER_BIN" container stop "$EXPOSED_NAME" >/dev/null 2>&1 || true
suppress_output "$DOCKER_BIN" container rm "$EXPOSED_NAME"
fi
echo "${PORTS[@]}" >"$PORT_FILE"
service_start "$SERVICE" "true"
service_port_reconcile_status "$SERVICE"
dokku_log_info1 "Service $SERVICE exposed on port(s) [container->host]: $(service_exposed_ports "$SERVICE")"
}
service_port_unexpose() {
@@ -804,39 +847,41 @@ service_port_unexpose() {
declare SERVICE="$1"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local PORT_FILE="$SERVICE_ROOT/PORT"
service_port_pause "$SERVICE" "true"
rm -rf "$PORT_FILE"
service_port_reconcile_status "$SERVICE"
dokku_log_info1 "Service $SERVICE unexposed"
}
service_port_unpause() {
declare desc="start service exposure"
declare SERVICE="$1" LOG_FAIL="$2"
service_port_reconcile_status() {
declare SERVICE="$1"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local SERVICE_NAME="$(get_service_name "$SERVICE")"
local EXPOSED_NAME="${SERVICE_NAME}.ambassador"
local PORT_FILE="$SERVICE_ROOT/PORT"
# shellcheck disable=SC2068
local PORTS=(${@:3})
# shellcheck disable=SC2068
PORTS=(${PORTS[@]:-$(get_random_ports ${#PLUGIN_DATASTORE_PORTS[@]})})
local ID=$(cat "$SERVICE_ROOT/ID")
local SERVICE_NAME="$(get_service_name "$SERVICE")"
local EXPOSED_NAME="$SERVICE_NAME.ambassador"
[[ "${#PORTS[@]}" != "${#PLUGIN_DATASTORE_PORTS[@]}" ]] && dokku_log_fail "${#PLUGIN_DATASTORE_PORTS[@]} ports to be exposed need to be provided in the following order: ${PLUGIN_DATASTORE_PORTS[*]}"
if [[ "$LOG_FAIL" == "true" ]]; then
[[ -f "$PORT_FILE" ]] && PORTS=($(cat "$PORT_FILE")) && dokku_log_fail "Service $SERVICE already exposed on port(s) ${PORTS[*]}"
else
[[ ! -f "$PORT_FILE" ]] && return 0
PORTS=($(cat "$PORT_FILE"))
if [[ ! -s "$PORT_FILE" ]]; then
if "$DOCKER_BIN" container inspect "$EXPOSED_NAME" >/dev/null 2>&1; then
"$DOCKER_BIN" container stop "$EXPOSED_NAME" >/dev/null 2>&1 || true
suppress_output "$DOCKER_BIN" container rm "$EXPOSED_NAME"
return $?
fi
return
fi
echo "${PORTS[@]}" >"$PORT_FILE"
if is_container_status "$EXPOSED_NAME" "Running"; then
return
fi
if "$DOCKER_BIN" container inspect "$EXPOSED_NAME" >/dev/null 2>&1; then
suppress_output "$DOCKER_BIN" container start "$EXPOSED_NAME"
return $?
fi
# shellcheck disable=SC2207
PORTS=($(cat "$PORT_FILE"))
# shellcheck disable=SC2046
docker run -d --link "$SERVICE_NAME:$PLUGIN_COMMAND_PREFIX" --name "$EXPOSED_NAME" $(docker_ports_options "${PORTS[@]}") --restart always --label dokku=ambassador --label "dokku.ambassador=$PLUGIN_COMMAND_PREFIX" "$PLUGIN_AMBASSADOR_IMAGE" >/dev/null
if [[ "$LOG_FAIL" == "true" ]]; then
dokku_log_info1 "Service $SERVICE exposed on port(s) [container->host]: $(service_exposed_ports "$SERVICE")"
fi
"$DOCKER_BIN" container run -d --link "$SERVICE_NAME:$PLUGIN_COMMAND_PREFIX" --name "$EXPOSED_NAME" $(docker_ports_options "${PORTS[@]}") --restart always --label dokku=ambassador --label "dokku.ambassador=$PLUGIN_COMMAND_PREFIX" "$PLUGIN_AMBASSADOR_IMAGE" >/dev/null
}
service_promote() {
@@ -884,24 +929,26 @@ service_status() {
local ID="$(cat "$SERVICE_ROOT/ID")"
local CONTAINER_STATUS
CONTAINER_STATUS=$(docker inspect -f "{{.State.Status}}" "$ID" 2>/dev/null || true)
CONTAINER_STATUS=$("$DOCKER_BIN" container inspect -f "{{.State.Status}}" "$ID" 2>/dev/null || true)
[[ -n "$CONTAINER_STATUS" ]] && echo "$CONTAINER_STATUS" && return 0
echo "missing" && return 0
}
service_stop() {
declare desc="stop a running service"
service_pause() {
declare desc="pause a running service"
declare SERVICE="$1"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local SERVICE_NAME="$(get_service_name "$SERVICE")"
local ID=$(docker ps -aq --no-trunc --filter "name=^/$SERVICE_NAME$" --format '{{ .ID }}') || true
[[ -z $ID ]] && dokku_log_warn "Service is already stopped" && return 0
local ID=$("$DOCKER_BIN" container ps -aq --no-trunc --filter "name=^/$SERVICE_NAME$") || true
[[ -z $ID ]] && dokku_log_warn "Service is already paused" && return 0
if [[ -n $ID ]]; then
dokku_log_info2_quiet "Stopping container"
docker stop "$SERVICE_NAME" >/dev/null
service_port_pause "$SERVICE"
dokku_log_verbose_quiet "Container stopped"
dokku_log_info2_quiet "Pausing container"
"$DOCKER_BIN" container stop "$SERVICE_NAME" >/dev/null
if "$DOCKER_BIN" container inspect "$ID" >/dev/null 2>&1; then
"$DOCKER_BIN" container stop "$SERVICE_NAME.ambassador" >/dev/null 2>&1 || true
fi
dokku_log_verbose_quiet "Container paused"
else
dokku_log_verbose_quiet "No container exists for $SERVICE"
fi
@@ -930,8 +977,9 @@ service_unlink() {
[[ -z ${LINK[*]} ]] && dokku_log_fail "Not linked to app $APP"
plugn trigger service-action post-unlink "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "$APP"
if [[ "$DOKKU_GLOBAL_FLAGS" == *"--no-restart"* ]]; then
if [[ "$DOKKU_GLOBAL_FLAGS" == *"--no-restart"* ]] || [[ "$SERVICE_RESTART_APPS" == "false" ]]; then
config_unset --no-restart "$APP" "${LINK[@]}"
dokku_log_verbose "Skipping restart of linked app"
else
config_unset "$APP" "${LINK[@]}"
fi
@@ -942,7 +990,7 @@ service_version() {
declare desc="display the running version for an image"
declare SERVICE="$1"
local SERVICE_NAME="$(get_service_name "$SERVICE")"
docker inspect -f '{{.Config.Image}}' "$SERVICE_NAME" 2>/dev/null || true
"$DOCKER_BIN" container inspect -f '{{.Config.Image}}' "$SERVICE_NAME" 2>/dev/null || true
}
update_plugin_scheme_for_app() {
@@ -981,5 +1029,5 @@ write_database_name() {
# some datastores do not like special characters in database names
# so we need to normalize them out
echo "$SERVICE" | tr .- _ > "$SERVICE_ROOT/DATABASE_NAME"
echo "$SERVICE" | tr .- _ >"$SERVICE_ROOT/DATABASE_NAME"
}

11
config
View File

@@ -3,7 +3,8 @@ _DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
export POSTGRES_IMAGE=${POSTGRES_IMAGE:="$(awk -F '[ :]' '{print $2}' "${_DIR}/Dockerfile")"}
export POSTGRES_IMAGE_VERSION=${POSTGRES_IMAGE_VERSION:="$(awk -F '[ :]' '{print $3}' "${_DIR}/Dockerfile")"}
export POSTGRES_ROOT=${POSTGRES_ROOT:="$DOKKU_LIB_ROOT/services/postgres"}
export POSTGRES_HOST_ROOT=${POSTGRES_HOST_ROOT:=$POSTGRES_ROOT}
export DOKKU_LIB_HOST_ROOT=${DOKKU_LIB_HOST_ROOT:=$DOKKU_LIB_ROOT}
export POSTGRES_HOST_ROOT=${POSTGRES_HOST_ROOT:="$DOKKU_LIB_HOST_ROOT/services/postgres"}
export PLUGIN_UNIMPLEMENTED_SUBCOMMANDS=()
export PLUGIN_COMMAND_PREFIX="postgres"
@@ -27,9 +28,9 @@ if [[ -n $DOKKU_API_VERSION ]]; then
export PLUGIN_BASE_PATH="$PLUGIN_ENABLED_PATH"
fi
export PLUGIN_BUSYBOX_IMAGE="busybox:1.31.1-uclibc"
export PLUGIN_AMBASSADOR_IMAGE="dokku/ambassador:0.3.3"
export PLUGIN_S3BACKUP_IMAGE="dokku/s3backup:0.10.3"
export PLUGIN_WAIT_IMAGE="dokku/wait:0.4.3"
export PLUGIN_BUSYBOX_IMAGE="busybox:1.34.1-uclibc"
export PLUGIN_AMBASSADOR_IMAGE="dokku/ambassador:0.5.0"
export PLUGIN_S3BACKUP_IMAGE="dokku/s3backup:0.14.0"
export PLUGIN_WAIT_IMAGE="dokku/wait:0.6.0"
export POSTGRES_CONFIG_OPTIONS=${POSTGRES_CONFIG_OPTIONS:=""}

View File

@@ -1,4 +1,4 @@
Official Postgres docker images does not include postgis extension (amongst others). The following example creates a new postgres service using `postgis/postgis:13-3.1` image, which includes the `postgis` extension.
Official Postgres "$DOCKER_BIN" image ls does not include postgis extension (amongst others). The following example creates a new postgres service using `postgis/postgis:13-3.1` image, which includes the `postgis` extension.
```shell
dokku postgres:create postgis-database --image "postgis/postgis" --image-version "13-3.1"

View File

@@ -4,6 +4,7 @@ set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/common-functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/property-functions"
source "$PLUGIN_AVAILABLE_PATH/config/functions"
if [[ -f "$PLUGIN_AVAILABLE_PATH/docker-options/functions" ]]; then
source "$PLUGIN_AVAILABLE_PATH/docker-options/functions"
@@ -17,7 +18,7 @@ service_connect() {
local SERVICE_TTY_OPTS
has_tty && SERVICE_TTY_OPTS="-t"
docker exec --env=LANG=C.UTF-8 --env=LC_ALL=C.UTF-8 -i $SERVICE_TTY_OPTS "$SERVICE_NAME" psql -h localhost -U postgres "$DATABASE_NAME"
"$DOCKER_BIN" container exec --env=LANG=C.UTF-8 --env=LC_ALL=C.UTF-8 -i $SERVICE_TTY_OPTS "$SERVICE_NAME" psql -h localhost -U postgres "$DATABASE_NAME"
}
service_create() {
@@ -33,11 +34,11 @@ service_create() {
if ! service_image_exists "$SERVICE"; then
if [[ "$PLUGIN_DISABLE_PULL" == "true" ]]; then
dokku_log_warn "${PLUGIN_DISABLE_PULL_VARIABLE} environment variable detected. Not running pull command." 1>&2
dokku_log_warn " docker pull ${IMAGE}" 1>&2
dokku_log_warn " docker image pull ${IMAGE}" 1>&2
dokku_log_warn "$PLUGIN_SERVICE service creation failed"
exit 1
fi
docker pull "$PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION" || dokku_log_fail "$PLUGIN_SERVICE image $PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION pull failed"
"$DOCKER_BIN" image pull "$PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION" || dokku_log_fail "$PLUGIN_SERVICE image $PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION pull failed"
fi
plugn trigger service-action pre-create "$PLUGIN_COMMAND_PREFIX" "$SERVICE"
@@ -73,36 +74,87 @@ service_create_container() {
export CONFIG_OPTIONS="$(cat "$SERVICE_ROOT/CONFIG_OPTIONS")"
fi
local network_alias="$(service_dns_hostname "$SERVICE")"
rm -f "$SERVICE_ROOT/ID"
declare -a DOCKER_ARGS
DOCKER_ARGS=()
DOCKER_ARGS+=("--cidfile=$SERVICE_ROOT/ID")
DOCKER_ARGS+=("--env-file=$SERVICE_ROOT/ENV")
DOCKER_ARGS+=("--env=POSTGRES_PASSWORD=$PASSWORD")
DOCKER_ARGS+=("--hostname=$SERVICE_NAME")
DOCKER_ARGS+=("--label=dokku.service=$PLUGIN_COMMAND_PREFIX")
DOCKER_ARGS+=("--label=dokku=service")
DOCKER_ARGS+=("--name=$SERVICE_NAME")
DOCKER_ARGS+=("--restart=always")
DOCKER_ARGS+=("--volume=$SERVICE_HOST_ROOT/data:/var/lib/postgresql/data")
declare -a LINK_CONTAINER_DOCKER_ARGS
LINK_CONTAINER_DOCKER_ARGS=()
LINK_CONTAINER_DOCKER_ARGS+=("--rm")
LINK_CONTAINER_DOCKER_ARGS+=("--link")
LINK_CONTAINER_DOCKER_ARGS+=("$SERVICE_NAME:$network_alias")
[[ -f "$SERVICE_ROOT/SERVICE_MEMORY" ]] && SERVICE_MEMORY="$(cat "$SERVICE_ROOT/SERVICE_MEMORY")"
if [[ -n "$SERVICE_MEMORY" ]]; then
MEMORY_LIMIT="--memory=${SERVICE_MEMORY}m"
DOCKER_ARGS+=("--memory=${SERVICE_MEMORY}m")
fi
[[ -f "$SERVICE_ROOT/SHM_SIZE" ]] && SERVICE_SHM_SIZE="$(cat "$SERVICE_ROOT/SHM_SIZE")"
if [[ -n "$SERVICE_SHM_SIZE" ]]; then
SHM_SIZE="--shm-size=${SERVICE_SHM_SIZE}"
DOCKER_ARGS+=("--shm-size=${SERVICE_SHM_SIZE}")
fi
[[ -f "$SERVICE_ROOT/IMAGE" ]] && PLUGIN_IMAGE="$(cat "$SERVICE_ROOT/IMAGE")"
[[ -f "$SERVICE_ROOT/IMAGE_VERSION" ]] && PLUGIN_IMAGE_VERSION="$(cat "$SERVICE_ROOT/IMAGE_VERSION")"
local network="$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "initial-network")"
if [[ -n "$network" ]]; then
DOCKER_ARGS+=("--network=${network}")
DOCKER_ARGS+=("--network-alias=${network_alias}")
LINK_CONTAINER_DOCKER_ARGS+=("--network=${network}")
fi
# shellcheck disable=SC2086
ID=$(docker run --name "$SERVICE_NAME" $MEMORY_LIMIT $SHM_SIZE -v "$SERVICE_HOST_ROOT/data:/var/lib/postgresql/data" -e "POSTGRES_PASSWORD=$PASSWORD" --env-file="$SERVICE_ROOT/ENV" -d --restart always --label dokku=service --label dokku.service=postgres "$PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION" $CONFIG_OPTIONS)
echo "$ID" >"$SERVICE_ROOT/ID"
suppress_output "$DOCKER_BIN" container create "${DOCKER_ARGS[@]}" "$PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION" $CONFIG_OPTIONS
if [[ -n "$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "post-create-network")" ]]; then
dokku_log_verbose_quiet "Connecting to networks after container create"
while read -r line || [[ -n "$line" ]]; do
dokku_log_verbose_quiet "- $line"
"$DOCKER_BIN" network connect --alias "$network_alias" "$line" "$SERVICE_NAME"
done < <(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "post-create-network" | tr "," "\n")
fi
suppress_output "$DOCKER_BIN" container start "$(cat "$SERVICE_ROOT/ID")"
service_port_reconcile_status "$SERVICE"
if [[ -n "$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "post-start-network")" ]]; then
dokku_log_verbose_quiet "Connecting to networks after container start"
while read -r line || [[ -n "$line" ]]; do
dokku_log_verbose_quiet "- $line"
"$DOCKER_BIN" network connect --alias "$network_alias" "$line" "$SERVICE_NAME"
done < <(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "post-start-network" | tr "," "\n")
fi
dokku_log_verbose_quiet "Waiting for container to be ready"
docker run --rm --link "$SERVICE_NAME:$PLUGIN_COMMAND_PREFIX" "$PLUGIN_WAIT_IMAGE" -p "$PLUGIN_DATASTORE_WAIT_PORT" >/dev/null
if ! suppress_output "$DOCKER_BIN" container run "${LINK_CONTAINER_DOCKER_ARGS[@]}" "$PLUGIN_WAIT_IMAGE" -c "$network_alias:$PLUGIN_DATASTORE_WAIT_PORT"; then
dokku_log_info2_quiet "Start of $SERVICE container output"
dokku_container_log_verbose_quiet "$SERVICE_NAME"
dokku_log_info2_quiet "End of $SERVICE container output"
return 1
fi
dokku_log_verbose_quiet "Creating container database"
docker exec "$SERVICE_NAME" su - postgres -c "createdb -E utf8 $DATABASE_NAME" 2>/dev/null || dokku_log_verbose_quiet 'Already exists'
"$DOCKER_BIN" container exec "$SERVICE_NAME" su - postgres -c "createdb -E utf8 $DATABASE_NAME" 2>/dev/null || dokku_log_verbose_quiet 'Already exists'
dokku_log_verbose_quiet "Securing connection to database"
service_stop "$SERVICE" >/dev/null
docker run --rm -i -v "$SERVICE_HOST_ROOT/data:/var/lib/postgresql/data" "$PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION" bash -s <"$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/scripts/enable_ssl.sh" &>/dev/null
service_pause "$SERVICE" >/dev/null
"$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/scripts/create_ssl_certs.sh" "$SERVICE_HOST_ROOT" &>/dev/null
"$DOCKER_BIN" container run --rm -i -v "$SERVICE_HOST_ROOT/data:/var/lib/postgresql/data" -v "$SERVICE_HOST_ROOT/certs:/var/lib/postgresql/certs" "$PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION" bash -s <"$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/scripts/enable_ssl.sh" &>/dev/null
rm -rf "$SERVICE_HOST_ROOT/certs"
PREVIOUS_ID=$(docker ps -aq --no-trunc --filter "status=exited" --filter "name=^/$SERVICE_NAME$" --format '{{ .ID }}') || true
docker start "$PREVIOUS_ID" >/dev/null
service_port_unpause "$SERVICE"
suppress_output "$DOCKER_BIN" container start "$(cat "$SERVICE_ROOT/ID")"
service_port_reconcile_status "$SERVICE"
dokku_log_info2 "$PLUGIN_SERVICE container created: $SERVICE"
service_info "$SERVICE"
@@ -116,7 +168,7 @@ service_export() {
local PASSWORD="$(service_password "$SERVICE")"
[[ -n $SSH_TTY ]] && stty -opost
docker exec "$SERVICE_NAME" env PGPASSWORD="$PASSWORD" pg_dump -Fc --no-acl --no-owner -h localhost -U postgres -w "$DATABASE_NAME"
"$DOCKER_BIN" container exec "$SERVICE_NAME" env PGPASSWORD="$PASSWORD" pg_dump -Fc --no-acl --no-owner -h localhost -U postgres -w "$DATABASE_NAME"
status=$?
[[ -n $SSH_TTY ]] && stty opost
exit $status
@@ -133,7 +185,7 @@ service_import() {
if [[ -t 0 ]]; then
dokku_log_fail "No data provided on stdin."
fi
docker exec -i "$SERVICE_NAME" env PGPASSWORD="$PASSWORD" pg_restore -h localhost -cO --if-exists -d "$DATABASE_NAME" -U postgres -w
"$DOCKER_BIN" container exec -i "$SERVICE_NAME" env PGPASSWORD="$PASSWORD" pg_restore -h localhost -cO --if-exists -d "$DATABASE_NAME" -U postgres -w
}
service_start() {
@@ -141,7 +193,7 @@ service_start() {
local QUIET="$2"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local SERVICE_NAME="$(get_service_name "$SERVICE")"
local ID=$(docker ps -aq --no-trunc --filter "status=running" --filter "name=^/$SERVICE_NAME$" --format '{{ .ID }}') || true
local ID=$("$DOCKER_BIN" container ps -aq --no-trunc --filter "status=running" --filter "name=^/$SERVICE_NAME$") || true
if [[ -n $ID ]]; then
[[ -z $QUIET ]] && dokku_log_warn "Service is already started"
if [[ ! -f "$SERVICE_ROOT/ID" ]] || [[ "$(cat "$SERVICE_ROOT/ID")" != "$ID" ]]; then
@@ -152,12 +204,12 @@ service_start() {
fi
dokku_log_info2_quiet "Starting container"
local PREVIOUS_ID=$(docker ps -aq --no-trunc --filter "status=exited" --filter "name=^/$SERVICE_NAME$" --format '{{ .ID }}') || true
local PREVIOUS_ID=$("$DOCKER_BIN" container ps -aq --no-trunc --filter "status=exited" --filter "name=^/$SERVICE_NAME$") || true
local PASSWORD="$(service_password "$SERVICE")"
if [[ -n $PREVIOUS_ID ]]; then
docker start "$PREVIOUS_ID" >/dev/null
service_port_unpause "$SERVICE"
"$DOCKER_BIN" container start "$PREVIOUS_ID" >/dev/null
service_port_reconcile_status "$SERVICE"
dokku_log_info2 "Container started"
elif service_image_exists "$SERVICE" && [[ -n "$PASSWORD" ]]; then
service_create_container "$SERVICE"

12
install
View File

@@ -1,6 +1,7 @@
#!/usr/bin/env bash
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/config"
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/common-functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/property-functions"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
@@ -9,14 +10,15 @@ plugin-install() {
declare IMAGE="$1"
if [[ "$PLUGIN_DISABLE_PULL" == "true" ]]; then
echo " ! ${PLUGIN_DISABLE_PULL_VARIABLE} environment variable detected. Not running pull command." 1>&2
echo " ! docker pull ${IMAGE}" 1>&2
echo " ! docker image pull ${IMAGE}" 1>&2
return
fi
if [[ "$(docker images -q "${IMAGE}" 2>/dev/null)" == "" ]]; then
docker pull "${IMAGE}"
if [[ "$("$DOCKER_BIN" image ls -q "${IMAGE}" 2>/dev/null)" == "" ]]; then
"$DOCKER_BIN" image pull "${IMAGE}"
fi
}
fn-plugin-property-setup "$PLUGIN_COMMAND_PREFIX"
pull-docker-image "${PLUGIN_IMAGE}:${PLUGIN_IMAGE_VERSION}"
pull-docker-image "$PLUGIN_BUSYBOX_IMAGE"
pull-docker-image "$PLUGIN_AMBASSADOR_IMAGE"
@@ -50,8 +52,8 @@ EOL
if [[ ! -f "$SERVICE_ROOT/IMAGE" ]] || [[ ! -f "$SERVICE_ROOT/IMAGE_VERSION" ]]; then
local image="$(service_version "$SERVICE")"
if [[ "$image" == *":"* ]]; then
echo "${image%:*}" > "$SERVICE_ROOT/IMAGE"
echo "${image##*:}" > "$SERVICE_ROOT/IMAGE_VERSION"
echo "${image%:*}" >"$SERVICE_ROOT/IMAGE"
echo "${image##*:}" >"$SERVICE_ROOT/IMAGE_VERSION"
fi
fi

View File

@@ -1,4 +1,4 @@
[plugin]
description = "dokku postgres service plugin"
version = "1.22.0"
version = "1.34.0"
[plugin.config]

7
scripts/create_ssl_certs.sh Executable file
View File

@@ -0,0 +1,7 @@
#!/bin/sh
postgres_service_dir="$1"
cd "$postgres_service_dir"
mkdir certs && cd certs
openssl req -new -newkey rsa:4096 -x509 -days 365000 -nodes -out server.crt -keyout server.key -batch

View File

@@ -1,7 +1,10 @@
#!/bin/bash
pushd /var/lib/postgresql/data >/dev/null
openssl req -new -newkey rsa:4096 -x509 -days 365000 -nodes -out server.crt -keyout server.key -batch
#!/bin/sh
cd /var/lib/postgresql/data
cp ../certs/* .
chown postgres:postgres server.key
chmod 600 server.key
sed -i "s/^#ssl = off/ssl = on/" postgresql.conf
sed -i "s/^#ssl_ciphers =.*/ssl_ciphers = 'AES256+EECDH:AES256+EDH'/" postgresql.conf
popd >/dev/null

20
service-list Executable file
View File

@@ -0,0 +1,20 @@
#!/usr/bin/env bash
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/config"
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/common-functions"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
plugin-service-list() {
declare desc="allows listing all services for use by other dokku plugins"
declare SERVICE_TYPE="$1"
if [[ -n "$SERVICE_TYPE" ]] && [[ "$SERVICE_TYPE" != "$PLUGIN_COMMAND_PREFIX" ]]; then
return
fi
for service in $(fn-services-list false); do
echo "$PLUGIN_COMMAND_PREFIX:$service"
done
}
plugin-service-list "$@"

View File

@@ -2,7 +2,7 @@
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/config"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_BASE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
service-app-links-cmd() {

View File

@@ -2,7 +2,7 @@
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/config"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_BASE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
service-backup-cmd() {

View File

@@ -2,7 +2,7 @@
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/config"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_BASE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
service-backup-auth-cmd() {

View File

@@ -2,7 +2,7 @@
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/config"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_BASE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
service-backup-deauth-cmd() {

View File

@@ -2,7 +2,7 @@
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/config"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_BASE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
service-backup-schedule-cmd() {

View File

@@ -2,7 +2,7 @@
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/config"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_BASE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
service-backup-schedule-cat-cmd() {

View File

@@ -2,7 +2,7 @@
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/config"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_BASE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
service-backup-set-encryption-cmd() {

View File

@@ -2,7 +2,7 @@
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/config"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_BASE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
service-backup-unschedule-cmd() {

View File

@@ -2,7 +2,7 @@
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/config"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_BASE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
service-backup-unset-encryption-cmd() {

View File

@@ -2,7 +2,7 @@
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/config"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_BASE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
service-clone-cmd() {
@@ -15,8 +15,11 @@ service-clone-cmd() {
#F -i|--image IMAGE, the image name to start the service with
#F -I|--image-version IMAGE_VERSION, the image version to start the service with
#F -m|--memory MEMORY, container memory limit in megabytes (default: unlimited)
#F -N|--initial-network INITIAL_NETWORK, the initial network to attach the service to
#F -p|--password PASSWORD, override the user-level service password
#F -P|--post-create-network NETWORKS, a comman-separated list of networks to attach the service container to after service creation
#F -r|--root-password PASSWORD, override the root-level service password
#F -S|--post-start-network NETWORKS, a comman-separated list of networks to attach the service container to after service start
#F -s|--shm-size SHM_SIZE, override shared memory size for $PLUGIN_COMMAND_PREFIX docker container
declare desc="create container <new-name> then copy data from <name> into <new-name>"
local cmd="$PLUGIN_COMMAND_PREFIX:clone" argv=("$@")

View File

@@ -2,7 +2,7 @@
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/config"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_BASE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
service-connect-cmd() {

View File

@@ -2,7 +2,7 @@
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/config"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_BASE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
service-create-cmd() {
@@ -23,8 +23,11 @@ service-create-cmd() {
#F -i|--image IMAGE, the image name to start the service with
#F -I|--image-version IMAGE_VERSION, the image version to start the service with
#F -m|--memory MEMORY, container memory limit in megabytes (default: unlimited)
#F -N|--initial-network INITIAL_NETWORK, the initial network to attach the service to
#F -p|--password PASSWORD, override the user-level service password
#F -P|--post-create-network NETWORKS, a comman-separated list of networks to attach the service container to after service creation
#F -r|--root-password PASSWORD, override the root-level service password
#F -S|--post-start-network NETWORKS, a comman-separated list of networks to attach the service container to after service start
#F -s|--shm-size SHM_SIZE, override shared memory size for $PLUGIN_COMMAND_PREFIX docker container
declare desc="create a $PLUGIN_SERVICE service"
local cmd="$PLUGIN_COMMAND_PREFIX:create" argv=("$@")

View File

@@ -2,7 +2,7 @@
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/config"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_BASE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
service-destroy-cmd() {
@@ -46,9 +46,11 @@ service-destroy-cmd() {
service_container_rm "$SERVICE"
dokku_log_verbose_quiet "Removing data"
docker run --rm -v "$SERVICE_HOST_ROOT/data:/data" -v "$SERVICE_HOST_ROOT/$PLUGIN_CONFIG_SUFFIX:/config" "$PLUGIN_BUSYBOX_IMAGE" chmod 777 -R /config /data
"$DOCKER_BIN" container run --rm -v "$SERVICE_HOST_ROOT/data:/data" -v "$SERVICE_HOST_ROOT/$PLUGIN_CONFIG_SUFFIX:/config" "$PLUGIN_BUSYBOX_IMAGE" chmod 777 -R /config /data
rm -rf "$SERVICE_ROOT"
fn-plugin-property-destroy "$PLUGIN_COMMAND_PREFIX" "$SERVICE"
plugn trigger service-action post-delete "$PLUGIN_COMMAND_PREFIX" "$SERVICE"
dokku_log_info2 "$PLUGIN_SERVICE container deleted: $SERVICE"
}

View File

@@ -2,7 +2,7 @@
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/config"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_BASE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
service-enter-cmd() {
@@ -19,8 +19,8 @@ service-enter-cmd() {
[[ ${argv[0]} == "$cmd" ]] && shift 1
declare SERVICE="$1"
dokku_log_info1_quiet "Filesystem changes may not persist after container restarts"
verify_service_name "$SERVICE"
dokku_log_info1_quiet "Filesystem changes may not persist after container restarts"
service_enter "$SERVICE" "${@:2}"
}

View File

@@ -2,7 +2,7 @@
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/config"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_BASE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
service-exists-cmd() {

View File

@@ -2,7 +2,7 @@
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/config"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_BASE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
service-export-cmd() {

View File

@@ -2,7 +2,7 @@
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/config"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_BASE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
service-expose-cmd() {

View File

@@ -2,7 +2,7 @@
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/config"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_BASE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
service-import-cmd() {

View File

@@ -2,7 +2,7 @@
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/config"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_BASE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
service-info-cmd() {
@@ -15,7 +15,10 @@ service-info-cmd() {
#E dokku $PLUGIN_COMMAND_PREFIX:info lollipop --exposed-ports
#E dokku $PLUGIN_COMMAND_PREFIX:info lollipop --id
#E dokku $PLUGIN_COMMAND_PREFIX:info lollipop --internal-ip
#E dokku $PLUGIN_COMMAND_PREFIX:info lollipop --initial-network
#E dokku $PLUGIN_COMMAND_PREFIX:info lollipop --links
#E dokku $PLUGIN_COMMAND_PREFIX:info lollipop --post-create-network
#E dokku $PLUGIN_COMMAND_PREFIX:info lollipop --post-start-network
#E dokku $PLUGIN_COMMAND_PREFIX:info lollipop --service-root
#E dokku $PLUGIN_COMMAND_PREFIX:info lollipop --status
#E dokku $PLUGIN_COMMAND_PREFIX:info lollipop --version
@@ -26,7 +29,10 @@ service-info-cmd() {
#F --exposed-ports, show service exposed ports
#F --id, show the service container id
#F --internal-ip, show the service internal ip
#F --initial-network, show the initial network being connected to
#F --links, show the service app links
#F --post-create-network, show the networks to attach to after service container creation
#F --post-start-network, show the networks to attach to after service container start
#F --service-root, show the service root directory
#F --status, show the service running status
#F --version, show the service image version

View File

@@ -2,7 +2,7 @@
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/config"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_BASE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
service-link-cmd() {
@@ -42,6 +42,7 @@ service-link-cmd() {
#A app, app to run command against
#F -a|--alias "BLUE_DATABASE", an alternative alias to use for linking to an app via environment variable
#F -q|--querystring "pool=5", ampersand delimited querystring arguments to append to the service link
#F -n|--no-restart "false", whether or not to restart the app on link (default: true)
declare desc="link the $PLUGIN_SERVICE service to the app"
local cmd="$PLUGIN_COMMAND_PREFIX:link" argv=("$@")
[[ ${argv[0]} == "$cmd" ]] && shift 1

View File

@@ -2,7 +2,7 @@
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/config"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_BASE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
service-linked-cmd() {

View File

@@ -2,7 +2,7 @@
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/config"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_BASE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
service-links-cmd() {

View File

@@ -2,7 +2,7 @@
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/config"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_BASE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
service-list-cmd() {

View File

@@ -2,7 +2,7 @@
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/config"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_BASE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
service-logs-cmd() {

22
subcommands/pause Executable file
View File

@@ -0,0 +1,22 @@
#!/usr/bin/env bash
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/config"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
service-pause-cmd() {
#E pause the running container for the service
#E dokku $PLUGIN_COMMAND_PREFIX:pause lollipop
#A service, service to run command against
declare desc="pause a running $PLUGIN_SERVICE service"
local cmd="$PLUGIN_COMMAND_PREFIX:pause" argv=("$@")
[[ ${argv[0]} == "$cmd" ]] && shift 1
declare SERVICE="$1"
[[ -z "$SERVICE" ]] && dokku_log_fail "Please specify a valid name for the service"
verify_service_name "$SERVICE"
service_pause "$SERVICE"
}
service-pause-cmd "$@"

View File

@@ -2,7 +2,7 @@
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/config"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_BASE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
service-promote-cmd() {

View File

@@ -2,7 +2,7 @@
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/config"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_BASE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
service-restart-cmd() {
@@ -16,7 +16,7 @@ service-restart-cmd() {
[[ -z "$SERVICE" ]] && dokku_log_fail "Please specify a valid name for the service"
verify_service_name "$SERVICE"
service_stop "$SERVICE"
service_pause "$SERVICE"
service_start "$SERVICE"
dokku_log_info1 "Please call dokku ps:restart on all linked apps"
}

45
subcommands/set Executable file
View File

@@ -0,0 +1,45 @@
#!/usr/bin/env bash
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/config"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/property-functions"
source "$(cd "$(dirname "$(dirname "${BASH_SOURCE[0]}")")" && pwd)/common-functions"
service-set-cmd() {
#E set the network to attach after the service container is started
#E dokku $PLUGIN_COMMAND_PREFIX:set lollipop post-create-network custom-network
#E set multiple networks
#E dokku $PLUGIN_COMMAND_PREFIX:set lollipop post-create-network custom-network,other-network
#E unset the post-create-network value
#E dokku $PLUGIN_COMMAND_PREFIX:set lollipop post-create-network
#A service, service to run command against
#A key, property name to set
#A value, optional property value to set or empty to unset key
declare desc="set or clear a property for a service"
local cmd="$PLUGIN_COMMAND_PREFIX:set" argv=("$@")
[[ ${argv[0]} == "$cmd" ]] && shift 1
declare SERVICE="$1" KEY="$2" VALUE="$3"
local VALID_KEYS=("initial-network" "post-create-network" "post-start-network")
verify_service_name "$SERVICE"
[[ -z "$KEY" ]] && dokku_log_fail "No key specified"
if ! fn-in-array "$KEY" "${VALID_KEYS[@]}"; then
dokku_log_fail "Invalid key specified, valid keys include: initial-network, post-create-network, post-start-network"
fi
if [[ -n "$VALUE" ]]; then
dokku_log_info2_quiet "Setting ${KEY} to ${VALUE}"
fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "$KEY" "$VALUE"
else
dokku_log_info2_quiet "Unsetting ${KEY}"
if [[ "$KEY" == "rev-env-var" ]]; then
fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "$KEY" "$VALUE"
else
fn-plugin-property-delete "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "$KEY"
fi
fi
}
service-set-cmd "$@"

View File

@@ -2,7 +2,7 @@
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/config"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_BASE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
service-start-cmd() {

View File

@@ -2,11 +2,11 @@
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/config"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_BASE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
service-stop-cmd() {
#E stop the service and the running container
#E stop the service and removes the running container
#E dokku $PLUGIN_COMMAND_PREFIX:stop lollipop
#A service, service to run command against
declare desc="stop a running $PLUGIN_SERVICE service"
@@ -16,7 +16,7 @@ service-stop-cmd() {
[[ -z "$SERVICE" ]] && dokku_log_fail "Please specify a valid name for the service"
verify_service_name "$SERVICE"
service_stop "$SERVICE"
service_container_rm "$SERVICE"
}
service-stop-cmd "$@"

View File

@@ -2,7 +2,7 @@
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/config"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_BASE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
service-unexpose-cmd() {

View File

@@ -2,7 +2,7 @@
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/config"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_BASE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
service-unlink-cmd() {
@@ -11,6 +11,7 @@ service-unlink-cmd() {
#E dokku $PLUGIN_COMMAND_PREFIX:unlink lollipop playground
#A service, service to run command against
#A app, app to run command against
#F -n|--no-restart "false", whether or not to restart the app on unlink (default: true)
declare desc="unlink the $PLUGIN_SERVICE service from the app"
local cmd="$PLUGIN_COMMAND_PREFIX:unlink" argv=("$@")
[[ ${argv[0]} == "$cmd" ]] && shift 1

View File

@@ -2,7 +2,7 @@
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/config"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_BASE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
source "$PLUGIN_AVAILABLE_PATH/ps/functions"
@@ -14,7 +14,10 @@ service-upgrade-cmd() {
#F -C|--custom-env "USER=alpha;HOST=beta", semi-colon delimited environment variables to start the service with
#F -i|--image IMAGE, the image name to start the service with
#F -I|--image-version IMAGE_VERSION, the image version to start the service with
#F -R|--restart-apps "true", whether to force an app restart
#F -N|--initial-network INITIAL_NETWORK, the initial network to attach the service to
#F -P|--post-create-network NETWORKS, a comman-separated list of networks to attach the service container to after service creation
#F -R|--restart-apps "true", whether or not to force an app restart (default: false)
#F -S|--post-start-network NETWORKS, a comman-separated list of networks to attach the service container to after service start
#F -s|--shm-size SHM_SIZE, override shared memory size for $PLUGIN_COMMAND_PREFIX docker container
declare desc="upgrade service <service> to the specified versions"
local cmd="$PLUGIN_COMMAND_PREFIX:upgrade" argv=("$@")
@@ -28,8 +31,14 @@ service-upgrade-cmd() {
service_parse_args "${@:2}"
if ! service_image_exists "$SERVICE"; then
dokku_log_fail "Unable to proceed with upgrade, image ${PLUGIN_IMAGE}:${PLUGIN_IMAGE_VERSION} does not exist"
if ! service_image_exists "$SERVICE" "$PLUGIN_IMAGE" "$PLUGIN_IMAGE_VERSION"; then
if [[ "$PLUGIN_DISABLE_PULL" == "true" ]]; then
dokku_log_warn "${PLUGIN_DISABLE_PULL_VARIABLE} environment variable detected. Not running pull command." 1>&2
dokku_log_warn " docker image pull ${IMAGE}" 1>&2
dokku_log_warn "$PLUGIN_SERVICE service $SERVICE upgrade failed"
exit 1
fi
"$DOCKER_BIN" image pull "$PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION" || dokku_log_fail "$PLUGIN_SERVICE image $PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION pull failed"
fi
local NEW_PLUGIN_IMAGE_TAG="$PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION"

View File

@@ -3,17 +3,18 @@ load test_helper
setup() {
dokku apps:create my-app
dokku "$PLUGIN_COMMAND_PREFIX:create" l
dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app >&2
dokku "$PLUGIN_COMMAND_PREFIX:create" ls
dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app >&2
}
teardown() {
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app >&2
dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" l
dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app >&2
dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" ls
dokku --force apps:destroy my-app || true
}
@test "($PLUGIN_COMMAND_PREFIX:hook:pre-delete) removes app from links file when destroying app" {
[[ -n $(< "$PLUGIN_DATA_ROOT/l/LINKS") ]]
[[ -n $(<"$PLUGIN_DATA_ROOT/ls/LINKS") ]]
dokku --force apps:destroy my-app
[[ -z $(< "$PLUGIN_DATA_ROOT/l/LINKS") ]]
[[ -z $(<"$PLUGIN_DATA_ROOT/ls/LINKS") ]]
}

289
tests/link_networks.bats Executable file
View File

@@ -0,0 +1,289 @@
#!/usr/bin/env bats
load test_helper
setup() {
dokku "$PLUGIN_COMMAND_PREFIX:create" ls
dokku network:create custom-network
}
teardown() {
dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" ls || true
dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" lsa || true
dokku network:destroy --force custom-network
}
@test "($PLUGIN_COMMAND_PREFIX:set) set initial-network" {
run dokku "$PLUGIN_COMMAND_PREFIX:set" ls initial-network custom-network
echo "output: $output"
echo "status: $status"
assert_success
run dokku "$PLUGIN_COMMAND_PREFIX:info" ls --initial-network
echo "output: $output"
echo "status: $status"
assert_output "custom-network"
assert_success
run docker inspect dokku.$PLUGIN_COMMAND_PREFIX.ls -f '{{range $net,$v := .NetworkSettings.Networks}}{{printf "%s\n" $net}}{{end}}'
echo "output: $output"
echo "status: $status"
assert_success
assert_output_contains bridge
assert_output_contains custom-network 0
run dokku "$PLUGIN_COMMAND_PREFIX:stop" ls
echo "output: $output"
echo "status: $status"
assert_success
run dokku "$PLUGIN_COMMAND_PREFIX:start" ls
echo "output: $output"
echo "status: $status"
assert_success
run docker inspect dokku.$PLUGIN_COMMAND_PREFIX.ls -f '{{range $net,$v := .NetworkSettings.Networks}}{{printf "%s\n" $net}}{{end}}'
echo "output: $output"
echo "status: $status"
assert_success
assert_output_contains bridge 0
assert_output_contains custom-network
run docker inspect dokku.$PLUGIN_COMMAND_PREFIX.ls -f '{{range $net,$v := .NetworkSettings.Networks}}{{range $k,$alias := $v.Aliases}}{{printf "alias:%s\n" $alias}}{{end}}{{end}}'
echo "output: $output"
echo "status: $status"
assert_success
assert_output_contains "alias:dokku.$PLUGIN_COMMAND_PREFIX.ls"
assert_output_contains "alias:dokku-$PLUGIN_COMMAND_PREFIX-ls"
run dokku "$PLUGIN_COMMAND_PREFIX:set" ls initial-network
echo "output: $output"
echo "status: $status"
assert_success
run dokku "$PLUGIN_COMMAND_PREFIX:info" ls --initial-network
echo "output: $output"
echo "status: $status"
assert_output ""
assert_success
run dokku "$PLUGIN_COMMAND_PREFIX:stop" ls
echo "output: $output"
echo "status: $status"
assert_success
run dokku "$PLUGIN_COMMAND_PREFIX:start" ls
echo "output: $output"
echo "status: $status"
assert_success
run docker inspect dokku.$PLUGIN_COMMAND_PREFIX.ls -f '{{range $net,$v := .NetworkSettings.Networks}}{{printf "%s\n" $net}}{{end}}'
echo "output: $output"
echo "status: $status"
assert_success
assert_output_contains bridge
assert_output_contains custom-network 0
}
@test "($PLUGIN_COMMAND_PREFIX:set) set post-create-network" {
run dokku "$PLUGIN_COMMAND_PREFIX:set" ls post-create-network custom-network
echo "output: $output"
echo "status: $status"
assert_success
run dokku "$PLUGIN_COMMAND_PREFIX:info" ls --post-create-network
echo "output: $output"
echo "status: $status"
assert_output "custom-network"
assert_success
run docker inspect dokku.$PLUGIN_COMMAND_PREFIX.ls -f '{{range $net,$v := .NetworkSettings.Networks}}{{printf "%s\n" $net}}{{end}}'
echo "output: $output"
echo "status: $status"
assert_success
assert_output_contains bridge
assert_output_contains custom-network 0
run dokku "$PLUGIN_COMMAND_PREFIX:stop" ls
echo "output: $output"
echo "status: $status"
assert_success
run dokku "$PLUGIN_COMMAND_PREFIX:start" ls
echo "output: $output"
echo "status: $status"
assert_success
run docker inspect dokku.$PLUGIN_COMMAND_PREFIX.ls -f '{{range $net,$v := .NetworkSettings.Networks}}{{printf "%s\n" $net}}{{end}}'
echo "output: $output"
echo "status: $status"
assert_success
assert_output_contains custom-network
assert_output_contains bridge
run docker inspect dokku.$PLUGIN_COMMAND_PREFIX.ls -f '{{range $net,$v := .NetworkSettings.Networks}}{{range $k,$alias := $v.Aliases}}{{printf "alias:%s\n" $alias}}{{end}}{{end}}'
echo "output: $output"
echo "status: $status"
assert_success
assert_output_contains "alias:dokku.$PLUGIN_COMMAND_PREFIX.ls"
assert_output_contains "alias:dokku-$PLUGIN_COMMAND_PREFIX-ls"
run dokku "$PLUGIN_COMMAND_PREFIX:set" ls post-create-network
echo "output: $output"
echo "status: $status"
assert_success
run dokku "$PLUGIN_COMMAND_PREFIX:info" ls --post-create-network
echo "output: $output"
echo "status: $status"
assert_output ""
assert_success
run dokku "$PLUGIN_COMMAND_PREFIX:stop" ls
echo "output: $output"
echo "status: $status"
assert_success
run dokku "$PLUGIN_COMMAND_PREFIX:start" ls
echo "output: $output"
echo "status: $status"
assert_success
run docker inspect dokku.$PLUGIN_COMMAND_PREFIX.ls -f '{{range $net,$v := .NetworkSettings.Networks}}{{printf "%s\n" $net}}{{end}}'
echo "output: $output"
echo "status: $status"
assert_success
assert_output_contains bridge
assert_output_contains custom-network 0
}
@test "($PLUGIN_COMMAND_PREFIX:set) set an post-start-network" {
run dokku "$PLUGIN_COMMAND_PREFIX:set" ls post-start-network custom-network
echo "output: $output"
echo "status: $status"
assert_success
run dokku "$PLUGIN_COMMAND_PREFIX:info" ls --post-start-network
echo "output: $output"
echo "status: $status"
assert_output "custom-network"
assert_success
run docker inspect dokku.$PLUGIN_COMMAND_PREFIX.ls -f '{{range $net,$v := .NetworkSettings.Networks}}{{printf "%s\n" $net}}{{end}}'
echo "output: $output"
echo "status: $status"
assert_success
assert_output_contains bridge
assert_output_contains custom-network 0
run dokku "$PLUGIN_COMMAND_PREFIX:stop" ls
echo "output: $output"
echo "status: $status"
assert_success
run dokku "$PLUGIN_COMMAND_PREFIX:start" ls
echo "output: $output"
echo "status: $status"
assert_success
run docker inspect dokku.$PLUGIN_COMMAND_PREFIX.ls -f '{{range $net,$v := .NetworkSettings.Networks}}{{printf "%s\n" $net}}{{end}}'
echo "output: $output"
echo "status: $status"
assert_success
assert_output_contains bridge
assert_output_contains custom-network
run docker inspect dokku.$PLUGIN_COMMAND_PREFIX.ls -f '{{range $net,$v := .NetworkSettings.Networks}}{{range $k,$alias := $v.Aliases}}{{printf "alias:%s\n" $alias}}{{end}}{{end}}'
echo "output: $output"
echo "status: $status"
assert_success
assert_output_contains "alias:dokku.$PLUGIN_COMMAND_PREFIX.ls"
assert_output_contains "alias:dokku-$PLUGIN_COMMAND_PREFIX-ls"
run dokku "$PLUGIN_COMMAND_PREFIX:set" ls post-start-network
echo "output: $output"
echo "status: $status"
assert_success
run dokku "$PLUGIN_COMMAND_PREFIX:info" ls --post-start-network
echo "output: $output"
echo "status: $status"
assert_output ""
assert_success
run dokku "$PLUGIN_COMMAND_PREFIX:stop" ls
echo "output: $output"
echo "status: $status"
assert_success
run dokku "$PLUGIN_COMMAND_PREFIX:start" ls
echo "output: $output"
echo "status: $status"
assert_success
run docker inspect dokku.$PLUGIN_COMMAND_PREFIX.ls -f '{{range $net,$v := .NetworkSettings.Networks}}{{printf "%s\n" $net}}{{end}}'
echo "output: $output"
echo "status: $status"
assert_success
assert_output_contains bridge
assert_output_contains custom-network 0
}
@test "($PLUGIN_COMMAND_PREFIX:create) flags" {
run dokku "$PLUGIN_COMMAND_PREFIX:create" lsa --initial-network custom-network
echo "output: $output"
echo "status: $status"
assert_success
run docker inspect "dokku.$PLUGIN_COMMAND_PREFIX.lsa" -f '{{range $net,$v := .NetworkSettings.Networks}}{{printf "%s\n" $net}}{{end}}'
echo "output: $output"
echo "status: $status"
assert_success
assert_output_contains bridge 0
assert_output_contains custom-network
run dokku "$PLUGIN_COMMAND_PREFIX:destroy" lsa --force
echo "output: $output"
echo "status: $status"
assert_success
run dokku "$PLUGIN_COMMAND_PREFIX:create" lsa --post-create-network custom-network
echo "output: $output"
echo "status: $status"
assert_success
run docker inspect "dokku.$PLUGIN_COMMAND_PREFIX.lsa" -f '{{range $net,$v := .NetworkSettings.Networks}}{{printf "%s\n" $net}}{{end}}'
echo "output: $output"
echo "status: $status"
assert_success
assert_output_contains bridge
assert_output_contains custom-network
run docker inspect dokku.$PLUGIN_COMMAND_PREFIX.lsa -f '{{range $net,$v := .NetworkSettings.Networks}}{{range $k,$alias := $v.Aliases}}{{printf "alias:%s\n" $alias}}{{end}}{{end}}'
echo "output: $output"
echo "status: $status"
assert_success
assert_output_contains "alias:dokku.$PLUGIN_COMMAND_PREFIX.lsa"
assert_output_contains "alias:dokku-$PLUGIN_COMMAND_PREFIX-lsa"
run dokku "$PLUGIN_COMMAND_PREFIX:destroy" lsa --force
echo "output: $output"
echo "status: $status"
assert_success
run dokku "$PLUGIN_COMMAND_PREFIX:create" lsa --post-start-network custom-network
echo "output: $output"
echo "status: $status"
assert_success
run docker inspect "dokku.$PLUGIN_COMMAND_PREFIX.lsa" -f '{{range $net,$v := .NetworkSettings.Networks}}{{printf "%s\n" $net}}{{end}}'
echo "output: $output"
echo "status: $status"
assert_success
assert_output_contains bridge
assert_output_contains custom-network
run dokku "$PLUGIN_COMMAND_PREFIX:destroy" lsa --force
echo "output: $output"
echo "status: $status"
assert_success
}

View File

@@ -30,7 +30,7 @@ teardown() {
@test "($PLUGIN_COMMAND_PREFIX:clone) error when new service already exists" {
dokku "$PLUGIN_COMMAND_PREFIX:create" new_service
run dokku "$PLUGIN_COMMAND_PREFIX:clone" l new_service
assert_contains "${lines[*]}" "service new_service already exists"
assert_contains "${lines[*]}" "Invalid service name new_service"
assert_failure
dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" new_service

View File

@@ -23,7 +23,7 @@ teardown() {
if [[ -n "$GITHUB_WORKFLOW" ]]; then
skip "No tty is available on Github Actions"
fi
export SSH_TTY=`tty`
export SSH_TTY=$(tty)
run dokku "$PLUGIN_COMMAND_PREFIX:export" l
echo "output: $output"
echo "status: $status"

View File

@@ -2,29 +2,65 @@
load test_helper
setup() {
dokku "$PLUGIN_COMMAND_PREFIX:create" l
dokku "$PLUGIN_COMMAND_PREFIX:create" ls
}
teardown() {
dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" l
dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" ls
}
@test "($PLUGIN_COMMAND_PREFIX:expose) error when there are no arguments" {
run dokku "$PLUGIN_COMMAND_PREFIX:expose"
echo "output: $output"
echo "status: $status"
assert_failure
assert_contains "${lines[*]}" "Please specify a valid name for the service"
}
@test "($PLUGIN_COMMAND_PREFIX:expose) error when service does not exist" {
run dokku "$PLUGIN_COMMAND_PREFIX:expose" not_existing_service
echo "output: $output"
echo "status: $status"
assert_failure
assert_contains "${lines[*]}" "service not_existing_service does not exist"
}
@test "($PLUGIN_COMMAND_PREFIX:expose) error when already exposed" {
run dokku "$PLUGIN_COMMAND_PREFIX:expose" ls
echo "output: $output"
echo "status: $status"
assert_success
run dokku "$PLUGIN_COMMAND_PREFIX:expose" ls
echo "output: $output"
echo "status: $status"
assert_failure
assert_contains "${lines[*]}" "Service ls already exposed on port(s)"
run sudo rm "$PLUGIN_DATA_ROOT/ls/PORT"
echo "output: $output"
echo "status: $status"
assert_success
run dokku "$PLUGIN_COMMAND_PREFIX:expose" ls
echo "output: $output"
echo "status: $status"
assert_success
assert_contains "${lines[*]}" "Service ls has an untracked expose container, removing"
}
@test "($PLUGIN_COMMAND_PREFIX:expose) success when not providing custom ports" {
run dokku "$PLUGIN_COMMAND_PREFIX:expose" l
run dokku "$PLUGIN_COMMAND_PREFIX:expose" ls
echo "output: $output"
echo "status: $status"
assert_success
[[ "${lines[*]}" =~ exposed\ on\ port\(s\)\ \[container\-\>host\]\:\ [[:digit:]]+ ]]
}
@test "($PLUGIN_COMMAND_PREFIX:expose) success when providing custom ports" {
run dokku "$PLUGIN_COMMAND_PREFIX:expose" l 4242
run dokku "$PLUGIN_COMMAND_PREFIX:expose" ls 4242
echo "output: $output"
echo "status: $status"
assert_success
assert_contains "${lines[*]}" "exposed on port(s) [container->host]: 5432->4242"
}

View File

@@ -34,7 +34,7 @@ teardown() {
@test "($PLUGIN_COMMAND_PREFIX:import) success" {
skip "The fake dump is hard to work with in tests"
run dokku "$PLUGIN_COMMAND_PREFIX:import" l < "/tmp/fake.dump"
run dokku "$PLUGIN_COMMAND_PREFIX:import" l <"/tmp/fake.dump"
echo "output: $output"
echo "status: $status"
assert_success

View File

@@ -2,18 +2,17 @@
load test_helper
setup() {
dokku "$PLUGIN_COMMAND_PREFIX:create" l
dokku "$PLUGIN_COMMAND_PREFIX:create" m
dokku "$PLUGIN_COMMAND_PREFIX:create" ls
dokku "$PLUGIN_COMMAND_PREFIX:create" ms
dokku apps:create my-app
}
teardown() {
dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" m
dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" l
dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" ms
dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" ls
dokku --force apps:destroy my-app
}
@test "($PLUGIN_COMMAND_PREFIX:link) error when there are no arguments" {
run dokku "$PLUGIN_COMMAND_PREFIX:link"
echo "output: $output"
@@ -23,7 +22,7 @@ teardown() {
}
@test "($PLUGIN_COMMAND_PREFIX:link) error when the app argument is missing" {
run dokku "$PLUGIN_COMMAND_PREFIX:link" l
run dokku "$PLUGIN_COMMAND_PREFIX:link" ls
echo "output: $output"
echo "status: $status"
assert_contains "${lines[*]}" "Please specify an app to run the command on"
@@ -31,7 +30,7 @@ teardown() {
}
@test "($PLUGIN_COMMAND_PREFIX:link) error when the app does not exist" {
run dokku "$PLUGIN_COMMAND_PREFIX:link" l not_existing_app
run dokku "$PLUGIN_COMMAND_PREFIX:link" ls not_existing_app
echo "output: $output"
echo "status: $status"
assert_contains "${lines[*]}" "App not_existing_app does not exist"
@@ -47,73 +46,97 @@ teardown() {
}
@test "($PLUGIN_COMMAND_PREFIX:link) error when the service is already linked to app" {
dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app
run dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app
dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app
run dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app
echo "output: $output"
echo "status: $status"
assert_contains "${lines[*]}" "Already linked as DATABASE_URL"
assert_failure
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app
dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
}
@test "($PLUGIN_COMMAND_PREFIX:link) exports DATABASE_URL to app" {
run dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app
run dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app
echo "output: $output"
echo "status: $status"
url=$(dokku config:get my-app DATABASE_URL)
password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")"
assert_contains "$url" "postgres://postgres:$password@dokku-postgres-l:5432/l"
password="$(sudo cat "$PLUGIN_DATA_ROOT/ls/PASSWORD")"
assert_contains "$url" "postgres://postgres:$password@dokku-postgres-ls:5432/ls"
assert_success
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app
dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
}
@test "($PLUGIN_COMMAND_PREFIX:link) generates an alternate config url when DATABASE_URL already in use" {
dokku config:set my-app DATABASE_URL=postgres://user:pass@host:5432/db
dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app
dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app
run dokku config my-app
assert_contains "${lines[*]}" "DOKKU_POSTGRES_AQUA_URL"
assert_success
dokku "$PLUGIN_COMMAND_PREFIX:link" m my-app
dokku "$PLUGIN_COMMAND_PREFIX:link" ms my-app
run dokku config my-app
assert_contains "${lines[*]}" "DOKKU_POSTGRES_BLACK_URL"
assert_success
dokku "$PLUGIN_COMMAND_PREFIX:unlink" m my-app
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app
dokku "$PLUGIN_COMMAND_PREFIX:unlink" ms my-app
dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
}
@test "($PLUGIN_COMMAND_PREFIX:link) links to app with docker-options" {
dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app
dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app
run dokku docker-options:report my-app
assert_contains "${lines[*]}" "--link dokku.postgres.l:dokku-postgres-l"
assert_contains "${lines[*]}" "--link dokku.postgres.ls:dokku-postgres-ls"
assert_success
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app
dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
}
@test "($PLUGIN_COMMAND_PREFIX:link) uses apps POSTGRES_DATABASE_SCHEME variable" {
dokku config:set my-app POSTGRES_DATABASE_SCHEME=postgres2
dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app
dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app
url=$(dokku config:get my-app DATABASE_URL)
password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")"
assert_contains "$url" "postgres2://postgres:$password@dokku-postgres-l:5432/l"
password="$(sudo cat "$PLUGIN_DATA_ROOT/ls/PASSWORD")"
assert_contains "$url" "postgres2://postgres:$password@dokku-postgres-ls:5432/ls"
assert_success
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app
dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
}
@test "($PLUGIN_COMMAND_PREFIX:link) adds a querystring" {
dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app --querystring "pool=5"
dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app --querystring "pool=5"
url=$(dokku config:get my-app DATABASE_URL)
assert_contains "$url" "?pool=5"
assert_success
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app
dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
}
@test "($PLUGIN_COMMAND_PREFIX:link) uses a specified config url when alias is specified" {
dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app --alias "ALIAS"
dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app --alias "ALIAS"
url=$(dokku config:get my-app ALIAS_URL)
password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")"
assert_contains "$url" "postgres://postgres:$password@dokku-postgres-l:5432/l"
password="$(sudo cat "$PLUGIN_DATA_ROOT/ls/PASSWORD")"
assert_contains "$url" "postgres://postgres:$password@dokku-postgres-ls:5432/ls"
assert_success
dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
}
@test "($PLUGIN_COMMAND_PREFIX:link) respects --no-restart" {
run dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app
echo "output: $output"
echo "status: $status"
assert_output_contains "Skipping restart of linked app" 0
assert_success
run dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
echo "output: $output"
echo "status: $status"
assert_success
run dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app --no-restart
echo "output: $output"
echo "status: $status"
assert_output_contains "Skipping restart of linked app"
assert_success
run dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
echo "output: $output"
echo "status: $status"
assert_success
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app
}

25
tests/service_pause.bats Executable file
View File

@@ -0,0 +1,25 @@
#!/usr/bin/env bats
load test_helper
setup() {
dokku "$PLUGIN_COMMAND_PREFIX:create" l
}
teardown() {
dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" l
}
@test "($PLUGIN_COMMAND_PREFIX:pause) error when there are no arguments" {
run dokku "$PLUGIN_COMMAND_PREFIX:pause"
assert_contains "${lines[*]}" "Please specify a valid name for the service"
}
@test "($PLUGIN_COMMAND_PREFIX:pause) error when service does not exist" {
run dokku "$PLUGIN_COMMAND_PREFIX:pause" not_existing_service
assert_contains "${lines[*]}" "service not_existing_service does not exist"
}
@test "($PLUGIN_COMMAND_PREFIX:pause) success" {
run dokku "$PLUGIN_COMMAND_PREFIX:pause" l
assert_success
}

View File

@@ -23,4 +23,3 @@ teardown() {
run dokku "$PLUGIN_COMMAND_PREFIX:restart" l
assert_success
}

View File

@@ -23,4 +23,3 @@ teardown() {
run dokku "$PLUGIN_COMMAND_PREFIX:start" l
assert_success
}

View File

@@ -23,4 +23,3 @@ teardown() {
run dokku "$PLUGIN_COMMAND_PREFIX:stop" l
assert_success
}

View File

@@ -25,4 +25,3 @@ teardown() {
[[ ! -f $PLUGIN_DATA_ROOT/PORT ]]
assert_contains "${lines[*]}" "Service l unexposed"
}

View File

@@ -3,11 +3,11 @@ load test_helper
setup() {
dokku apps:create my-app
dokku "$PLUGIN_COMMAND_PREFIX:create" l
dokku "$PLUGIN_COMMAND_PREFIX:create" ls
}
teardown() {
dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" l
dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" ls
dokku --force apps:destroy my-app
}
@@ -17,12 +17,12 @@ teardown() {
}
@test "($PLUGIN_COMMAND_PREFIX:unlink) error when the app argument is missing" {
run dokku "$PLUGIN_COMMAND_PREFIX:unlink" l
run dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls
assert_contains "${lines[*]}" "Please specify an app to run the command on"
}
@test "($PLUGIN_COMMAND_PREFIX:unlink) error when the app does not exist" {
run dokku "$PLUGIN_COMMAND_PREFIX:unlink" l not_existing_app
run dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls not_existing_app
assert_contains "${lines[*]}" "App not_existing_app does not exist"
}
@@ -32,13 +32,13 @@ teardown() {
}
@test "($PLUGIN_COMMAND_PREFIX:unlink) error when service not linked to app" {
run dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app
run dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
assert_contains "${lines[*]}" "Not linked to app my-app"
}
@test "($PLUGIN_COMMAND_PREFIX:unlink) removes link from docker-options" {
dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app >&2
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app
dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app >&2
dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
check_value="Docker options build: Docker options deploy: --restart=on-failure:10 Docker options run:"
options=$(dokku --quiet docker-options:report my-app | xargs)
@@ -46,8 +46,32 @@ teardown() {
}
@test "($PLUGIN_COMMAND_PREFIX:unlink) unsets config url from app" {
dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app >&2
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app
dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app >&2
dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
config=$(dokku config:get my-app DATABASE_URL || true)
assert_equal "$config" ""
}
@test "($PLUGIN_COMMAND_PREFIX:unlink) respects --no-restart" {
run dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app
echo "output: $output"
echo "status: $status"
assert_success
run dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
echo "output: $output"
echo "status: $status"
assert_output_contains "Skipping restart of linked app" 0
assert_success
run dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app
echo "output: $output"
echo "status: $status"
assert_success
run dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app --no-restart
echo "output: $output"
echo "status: $status"
assert_output_contains "Skipping restart of linked app"
assert_success
}

View File

@@ -70,3 +70,17 @@ assert_output() {
fi
assert_equal "$expected" "$output"
}
# ShellCheck doesn't know about $output from Bats
# shellcheck disable=SC2154
assert_output_contains() {
local input="$output"
local expected="$1"
local count="${2:-1}"
local found=0
until [ "${input/$expected/}" = "$input" ]; do
input="${input/$expected/}"
found=$((found + 1))
done
assert_equal "$count" "$found"
}