{"id":356,"date":"2019-07-05T17:41:44","date_gmt":"2019-07-05T17:41:44","guid":{"rendered":"http:\/\/www.canchito-dev.com\/public\/blog\/?p=356"},"modified":"2021-05-02T13:40:54","modified_gmt":"2021-05-02T13:40:54","slug":"run-flowable-bpm-using-docker-and-mysql","status":"publish","type":"post","link":"http:\/\/www.canchito-dev.com\/public\/blog\/2019\/07\/05\/run-flowable-bpm-using-docker-and-mysql\/","title":{"rendered":"Run Flowable BPM using Docker and MySQL"},"content":{"rendered":"<h1>Run Flowable BPM using Docker and MySQL<\/h1>\n<div class=\"perfect-pullquote vcard pullquote-align-full pullquote-border-placement-left\"><blockquote><p><\/p>\n<p>In this article, you will learn how to compile Flowable source code using MySQL as database source, and generate valid Docker images. Once you have the images, we will use Docker Compose for defining and running a multi-container Docker applications.<\/p>\n<p><\/p><\/blockquote><\/div>\n<div>\n  <a class=\"donate-with-crypto\"\n     href=\"https:\/\/commerce.coinbase.com\/checkout\/faf64f90-2e80-46ee-aeba-0fde14cbeb46\"><br \/>\n    Buy Me a Coffee<br \/>\n  <\/a><br \/>\n  <script src=\"https:\/\/commerce.coinbase.com\/v1\/checkout.js?version=201807\">\n  <\/script>\n<\/div>\n<h2 style=\"text-align: justify;\">What you\u2019ll need<\/h2>\n<ul>\n<li>About 30 minutes<\/li>\n<li>A favorite IDE or Spring Tool Suite&#x2122; already install. In this tutorial, we used Visual Studio Code. You can download it from <a href=\"https:\/\/code.visualstudio.com\/download\">here<\/a>.<\/li>\n<li>Docker Desktop for you operating system already installed. For this tutorial, we used Docker Desktop for Windows. You can download it from <a href=\"https:\/\/docs.docker.com\/docker-for-windows\/install\/\">here<\/a>.<\/li>\n<\/ul>\n<h2 style=\"text-align: justify;\">Introduction<\/h2>\n<p>The full implementation of this article can be found in the <a href=\"https:\/\/github.com\/canchito-dev\/run-flowable-bpm-using-docker-and-mysql\">GitHub repository<\/a>.<\/p>\n<p style=\"text-align: justify;\">Flowable is a set of very compact and highly efficient open source business process engines. They provide a workflow and Business Process Management (BPM) platform for developers, system admins and business users.<\/p>\n<p style=\"text-align: justify;\">This lightweight and fast engine is written in Java. It is coupled with native Case Management (CMMN) and DMN engines. They are Apache 2.0 licensed open source, with a committed community.<\/p>\n<p style=\"text-align: justify;\">In this article, you will learn how to compile Flowable source code and generate valid Docker images. Once you have the images, we will use Docker Compose for defining and running a multi-container Docker applications.<\/p>\n<p style=\"text-align: justify;\">Because of license constraints, there are no official Flowable docker images with the MySQL connectors included. So, we will do some modifications to the source code, so that the images that we generate, include MySQL connectors by default.<\/p>\n<p style=\"text-align: justify;\">So let\u2019s get started!!<\/p>\n<h2 style=\"text-align: justify;\">Modifying the source code<\/h2>\n<p style=\"text-align: justify;\">Start by downloading the latest release of Flowable. You can get it from their official <a href=\"https:\/\/github.com\/flowable\/flowable-engine\/releases\">Github<\/a> site. Once you have it, import it into your favorite IDE. In this tutorial, we used Visual Studio Code.<\/p>\n<p style=\"text-align: justify;\">Once you have imported it, you will need to modify some <em>pom.xml<\/em> files found in different directories.<\/p>\n<p style=\"text-align: justify;\"><em>Root &gt; pom.xml<\/em><\/p>\n<p style=\"text-align: justify;\">By default, Flowable engine uses an in-memory database to store execution and historical data while running process instances. Since we will be using MySQL, we need to add the specific database driver dependency.<\/p>\n<p style=\"text-align: justify;\">Go to <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">root folder<\/code>, and modify the <em>pom.xml<\/em> file as shown below. Basically, we are modifying the H2 dependency\u2019s scope from runtime to test, and the MySQL dependency\u2019s scope from test to runtime.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"xml\">&lt;dependencies&gt;\r\n  &lt;dependency&gt;\r\n    &lt;groupId&gt;com.h2database&lt;\/groupId&gt;\r\n    &lt;artifactId&gt;h2&lt;\/artifactId&gt;\r\n    &lt;version&gt;1.4.197&lt;\/version&gt;\r\n    &lt;scope&gt;test&lt;\/scope&gt;\r\n  &lt;\/dependency&gt;\r\n\r\n  &lt;dependency&gt;\r\n    &lt;groupId&gt;mysql&lt;\/groupId&gt;\r\n    &lt;artifactId&gt;mysql-connector-java&lt;\/artifactId&gt;\r\n    &lt;version&gt;5.1.27&lt;\/version&gt;\r\n    &lt;scope&gt;runtime&lt;\/scope&gt;\r\n  &lt;\/dependency&gt;\r\n&lt;\/dependencies&gt;<\/pre>\n<p style=\"text-align: justify;\">Next, you will have to modify individual <em>pom.xml<\/em> file for each Flowable\u2019s apps. Look for the docker image build and push section. As you will notice, by default, it uses Postgre database and driver. Modify it to use MySQL\u2019s, just as in the below snipped.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"xml\">&lt;!-- docker image build and push --&gt;\r\n&lt;profile&gt;\r\n  &lt;id&gt;docker&lt;\/id&gt;\r\n  &lt;dependencies&gt;\r\n    &lt;dependency&gt;\r\n      &lt;groupId&gt;mysql&lt;\/groupId&gt;\r\n      &lt;artifactId&gt;mysql-connector-java&lt;\/artifactId&gt;\r\n      &lt;scope&gt;compile&lt;\/scope&gt;\r\n    &lt;\/dependency&gt;\r\n  &lt;\/dependencies&gt;\r\n  &lt;build&gt;\r\n    &lt;plugins&gt;\r\n      \u2026\r\n      \u2026\r\n    &lt;plugins&gt;\r\n  &lt;build&gt;\r\n&lt;profile&gt;<\/pre>\n<p style=\"text-align: justify;\">You will have to do this for the<em> pom.xml<\/em> found under:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">Root\r\n  |- modules\r\n    |- flowable-app-rest\r\n    |- flowable-ui-admin-app\r\n    |- flowable-ui-idm-app\r\n    |- flowable-ui-modeler-app\r\n    |- flowable-app-rest<\/pre>\n<p style=\"text-align: justify;\">That\u2019s it. Now you are ready to build Flowable\u2019s images.<\/p>\n<h2>Building Flowable\u2019s images<\/h2>\n<p style=\"text-align: justify;\">Until now, we have only prepared Flowable to include MySQL\u2019s dependency. It is time to build the source code, and create a Docker image from it.<\/p>\n<p style=\"text-align: justify;\">To do so, the Flowable Team was kind enough to create some scripts that do this for us. Under the <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">root folder<\/code>, you will see a <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">docker directory<\/code>. Inside you will see a script called <code class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">build-all-images.sh<\/code>. I recommend you to edit it, and include the skip test. Otherwise it takes too long to build and create the images. In the end, the script should look something like this:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">#!\/bin\/bash\r\necho \"Building all Java artifacts\"\r\ncd ..\r\nmvn -Pdistro clean install -DskipTests\r\n\r\necho \"Building REST app image\"\r\ncd modules\/flowable-app-rest\r\nmvn -Pdocker,swagger clean package -DskipTests\r\n\r\necho \"Building ADMIN app image\"\r\ncd ..\/flowable-ui-admin\r\nmvn -Pdocker clean package -DskipTests\r\n\r\necho \"Building IDM app image\"\r\ncd ..\/flowable-ui-idm\r\nmvn -Pdocker clean package -DskipTests\r\n\r\necho \"Building MODELER app image\"\r\ncd ..\/flowable-ui-modeler\r\nmvn -Pdocker clean package -DskipTests\r\n\r\necho \"Building TASK app image\"\r\ncd ..\/flowable-ui-task\r\nmvn -Pdocker clean package -DskipTests\r\n\r\necho \"Done...\"<\/pre>\n<p style=\"text-align: justify;\">If you want, you could add the <code class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">-U<\/code>, to force all the dependencies to be updated.<\/p>\n<h2 style=\"text-align: justify;\">Creating the docker compose yml file<\/h2>\n<p style=\"text-align: justify;\">By now, you should be able to see all of Flowable\u2019s application images in your repository. Let\u2019s list them.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">$ docker image ls\r\nREPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE\r\nflowable\/flowable-task      latest              08a369ab9e95        45 hours ago        179MB\r\nflowable\/flowable-modeler   latest              c87376d3b49f        45 hours ago        169MB\r\nflowable\/flowable-idm       latest              ba444b20d379        45 hours ago        162MB\r\nflowable\/flowable-admin     latest              eb1f12567a13        46 hours ago        170MB\r\nflowable\/flowable-rest      latest              9f81bec4177a        46 hours ago        170MB<\/pre>\n<p style=\"text-align: justify;\">As mentioned in the before, we will use Docker Compose for defining and running a multi-container Docker applications. Here is the <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">docker-compose.yml<\/code> file that we will use.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">version: '3.7'\r\nservices:\r\n\r\n    flowable-db:\r\n        image: mysql:5.7.26\r\n        container_name: flowable-mysql-5.7.26\r\n        volumes:\r\n            - db_data:\/var\/lib\/mysql\r\n        environment:\r\n            MYSQL_ROOT_PASSWORD: flowable\r\n            MYSQL_DATABASE: flowable\r\n            MYSQL_USER: flowable\r\n            MYSQL_PASSWORD: flowable\r\n        ports:\r\n            - 3306:3306\r\n    \r\n    adminer:\r\n        image: adminer\r\n        ports:\r\n            - 18080:8080\r\n\r\n    flowable-rest-app:\r\n        image: flowable\/flowable-rest\r\n        depends_on:\r\n            - flowable-db\r\n        environment:\r\n            - SERVER_PORT=9977\r\n            - SPRING_DATASOURCE_DRIVER-CLASS-NAME=com.mysql.jdbc.Driver\r\n            - SPRING_DATASOURCE_URL=jdbc:mysql:\/\/flowable-db:3306\/flowable?autoReconnect=true\r\n            - SPRING_DATASOURCE_USERNAME=flowable\r\n            - SPRING_DATASOURCE_PASSWORD=flowable\r\n            - FLOWABLE_REST_APP_ADMIN_USER-ID=rest-admin\r\n            - FLOWABLE_REST_APP_ADMIN_PASSWORD=test\r\n            - FLOWABLE_REST_APP_ADMIN_FIRST-NAME=Rest\r\n            - FLOWABLE_REST_APP_ADMIN_LAST-NAME=Admin\r\n        ports:\r\n            - 9977:9977\r\n        entrypoint: [\".\/wait-for-something.sh\", \"flowable-db\", \"3306\", \"MySQL\", \"java\", \"-jar\", \"app.war\"]\r\n\r\n    flowable-idm-app:\r\n        image: flowable\/flowable-idm\r\n        container_name: flowable-idm\r\n        depends_on:\r\n            - flowable-db\r\n        environment:\r\n            - SERVER_PORT=8080\r\n            - SPRING_DATASOURCE_DRIVER-CLASS-NAME=com.mysql.jdbc.Driver\r\n            - SPRING_DATASOURCE_URL=jdbc:mysql:\/\/flowable-db:3306\/flowable?autoReconnect=true\r\n            - SPRING_DATASOURCE_USERNAME=flowable\r\n            - SPRING_DATASOURCE_PASSWORD=flowable\r\n            - FLOWABLE_REST_APP_ADMIN_USER-ID=rest-admin\r\n            - FLOWABLE_REST_APP_ADMIN_PASSWORD=test\r\n            - FLOWABLE_REST_APP_ADMIN_FIRST-NAME=Rest\r\n            - FLOWABLE_REST_APP_ADMIN_LAST-NAME=Admin\r\n        ports:\r\n            - 8080:8080\r\n        entrypoint: [\".\/wait-for-something.sh\", \"flowable-db\", \"3306\", \"MySQL\", \"java\", \"-jar\", \"app.war\"]\r\n\r\n    flowable-task-app:\r\n        image: flowable\/flowable-task\r\n        container_name: flowable-task\r\n        depends_on:\r\n            - flowable-db\r\n            - flowable-idm-app\r\n        environment:\r\n            - SERVER_PORT=9999\r\n            - SPRING_DATASOURCE_DRIVER-CLASS-NAME=com.mysql.jdbc.Driver\r\n            - SPRING_DATASOURCE_URL=jdbc:mysql:\/\/flowable-db:3306\/flowable?autoReconnect=true\r\n            - SPRING_DATASOURCE_USERNAME=flowable\r\n            - SPRING_DATASOURCE_PASSWORD=flowable\r\n            - FLOWABLE_COMMON_APP_IDM-URL=http:\/\/flowable-idm-app:8080\/flowable-idm\r\n            - FLOWABLE_COMMON_APP_IDM-REDIRECT-URL=http:\/\/localhost:8080\/flowable-idm\r\n            - FLOWABLE_COMMON_APP_IDM-ADMIN_USER=admin\r\n            - FLOWABLE_COMMON_APP_IDM-ADMIN_PASSWORD=test\r\n        ports:\r\n            - 9999:9999\r\n        entrypoint: [\".\/wait-for-something.sh\", \"flowable-db\", \"3306\", \"MySQL\", \"java\", \"-jar\", \"app.war\"]\r\n\r\n    flowable-modeler-app:\r\n        image: flowable\/flowable-modeler\r\n        container_name: flowable-modeler\r\n        depends_on:\r\n            - flowable-db\r\n            - flowable-idm-app\r\n            - flowable-task-app\r\n        environment:\r\n            - SERVER_PORT=8888\r\n            - SPRING_DATASOURCE_DRIVER-CLASS-NAME=com.mysql.jdbc.Driver\r\n            - SPRING_DATASOURCE_URL=jdbc:mysql:\/\/flowable-db:3306\/flowable?autoReconnect=true\r\n            - SPRING_DATASOURCE_USERNAME=flowable\r\n            - SPRING_DATASOURCE_PASSWORD=flowable\r\n            - FLOWABLE_COMMON_APP_IDM-URL=http:\/\/flowable-idm-app:8080\/flowable-idm\r\n            - FLOWABLE_COMMON_APP_IDM-REDIRECT-URL=http:\/\/localhost:8080\/flowable-idm\r\n            - FLOWABLE_COMMON_APP_IDM-ADMIN_USER=admin\r\n            - FLOWABLE_COMMON_APP_IDM-ADMIN_PASSWORD=test\r\n            - FLOWABLE_MODELER_APP_DEPLOYMENT-API-URL=http:\/\/flowable-task-app:9999\/flowable-task\/app-api\r\n        ports:\r\n            - 8888:8888\r\n        entrypoint: [\".\/wait-for-something.sh\", \"flowable-db\", \"3306\", \"MySQL\", \"java\", \"-jar\", \"app.war\"]\r\n\r\n    flowable-admin-app:\r\n        image: flowable\/flowable-admin\r\n        container_name: flowable-admin\r\n        depends_on:\r\n            - flowable-db\r\n            - flowable-idm-app\r\n            - flowable-task-app\r\n        environment:\r\n            - SERVER_PORT=9988\r\n            - SPRING_DATASOURCE_DRIVER-CLASS-NAME=com.mysql.jdbc.Driver\r\n            - SPRING_DATASOURCE_URL=jdbc:mysql:\/\/flowable-db:3306\/flowable?autoReconnect=true\r\n            - SPRING_DATASOURCE_USERNAME=flowable\r\n            - SPRING_DATASOURCE_PASSWORD=flowable\r\n            - FLOWABLE_COMMON_APP_IDM-URL=http:\/\/flowable-idm-app:8080\/flowable-idm\r\n            - FLOWABLE_COMMON_APP_IDM-REDIRECT-URL=http:\/\/localhost:8080\/flowable-idm\r\n            - FLOWABLE_COMMON_APP_IDM-ADMIN_USER=admin\r\n            - FLOWABLE_COMMON_APP_IDM-ADMIN_PASSWORD=test\r\n            - FLOWABLE_ADMIN_APP_SERVER-CONFIG_PROCESS_SERVER-ADDRESS=http:\/\/flowable-task-app\r\n            - FLOWABLE_ADMIN_APP_SERVER-CONFIG_PROCESS_PORT=9999\r\n            - FLOWABLE_ADMIN_APP_SERVER-CONFIG_PROCESS_CONTEXT-ROOT=flowable-task\r\n            - FLOWABLE_ADMIN_APP_SERVER-CONFIG_PROCESS_REST-ROOT=process-api\r\n            - FLOWABLE_ADMIN_APP_SERVER-CONFIG_CMMN_SERVER-ADDRESS=http:\/\/flowable-task-app\r\n            - FLOWABLE_ADMIN_APP_SERVER-CONFIG_CMMN_PORT=9999\r\n            - FLOWABLE_ADMIN_APP_SERVER-CONFIG_CMMN_CONTEXT-ROOT=flowable-task\r\n            - FLOWABLE_ADMIN_APP_SERVER-CONFIG_CMMN_REST-ROOT=cmmn-api\r\n            - FLOWABLE_ADMIN_APP_SERVER-CONFIG_DMN_SERVER-ADDRESS=http:\/\/flowable-task-app\r\n            - FLOWABLE_ADMIN_APP_SERVER-CONFIG_DMN_PORT=9999\r\n            - FLOWABLE_ADMIN_APP_SERVER-CONFIG_DMN_CONTEXT-ROOT=flowable-task\r\n            - FLOWABLE_ADMIN_APP_SERVER-CONFIG_DMN_REST-ROOT=dmn-api\r\n            - FLOWABLE_ADMIN_APP_SERVER-CONFIG_FORM_SERVER-ADDRESS=http:\/\/flowable-task-app\r\n            - FLOWABLE_ADMIN_APP_SERVER-CONFIG_FORM_PORT=9999\r\n            - FLOWABLE_ADMIN_APP_SERVER-CONFIG_FORM_CONTEXT-ROOT=flowable-task\r\n            - FLOWABLE_ADMIN_APP_SERVER-CONFIG_FORM_REST-ROOT=form-api\r\n            - FLOWABLE_ADMIN_APP_SERVER-CONFIG_CONTENT_SERVER-ADDRESS=http:\/\/flowable-task-app\r\n            - FLOWABLE_ADMIN_APP_SERVER-CONFIG_CONTENT_PORT=9999\r\n            - FLOWABLE_ADMIN_APP_SERVER-CONFIG_CONTENT_CONTEXT-ROOT=flowable-task\r\n            - FLOWABLE_ADMIN_APP_SERVER-CONFIG_CONTENT_REST-ROOT=content-api\r\n            - FLOWABLE_ADMIN_APP_SERVER-CONFIG_APP_SERVER-ADDRESS=http:\/\/flowable-task-app\r\n            - FLOWABLE_ADMIN_APP_SERVER-CONFIG_APP_PORT=9999\r\n            - FLOWABLE_ADMIN_APP_SERVER-CONFIG_APP_CONTEXT-ROOT=flowable-task\r\n            - FLOWABLE_ADMIN_APP_SERVER-CONFIG_APP_REST-ROOT=app-api\r\n        ports:\r\n            - 9988:9988\r\n        entrypoint: [\".\/wait-for-something.sh\", \"flowable-db\", \"3306\", \"MySQL\", \"java\", \"-jar\", \"app.war\"]\r\n\r\nvolumes:\r\n    db_data: {}<\/pre>\n<p style=\"text-align: justify;\">In the file, we specify container for MySQL, and the Flowables apps. Notice that we have included <a href=\"https:\/\/www.adminer.org\/en\/\">adminer<\/a> database manager, so that we can access the database from a web interface.<\/p>\n<p style=\"text-align: justify;\">One very important thing to notice, is that each container has an entry point, which executes a script called <code class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">wait-for-something.sh<\/code> (thanks to Flowable\u2019s team). The script simple waits until the database is up, before starting Flowable\u2019s app. Here is a copy of the script:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">#!\/bin\/ash\r\nset -e\r\n\r\nhost=\"$1\"\r\nport=\"$2\"\r\ndescription=\"$3\"\r\nshift 3\r\ncmd=\"$@\"\r\n\r\nuntil nc -z \"$host\" \"$port\"; do\r\n    echo \"$description is unavailable - sleeping\"\r\n    sleep 1\r\ndone\r\n\r\n&gt;&amp;2 echo \"$description is up - executing command\"\r\nexec $cmd<\/pre>\n<p style=\"text-align: justify;\">Finally, we are ready to start Flowable. Execute the following command in the same directory where you created the <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">docker-compose.yml<\/code> file and <code class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">wait-for-something.sh<\/code> script:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">$ docker-compose up -d\r\nStarting flowable_adminer_1           ... done\r\nStarting flowable-mysql-5.7.26        ... done\r\nStarting flowable-idm                 ... done\r\nStarting flowable_flowable-rest-app_1 ... done\r\nStarting flowable-task                ... done\r\nStarting flowable-admin               ... done\r\nStarting flowable-modeler             ... done<\/pre>\n<p style=\"text-align: justify;\">Congratulations, you have successfully built and deployed Flowable\u2019s app with MySQL.<\/p>\n<h2 style=\"text-align: justify;\">Accessing Flowable\u2019s apps<\/h2>\n<p style=\"text-align: justify;\">Here is a list of the URLs that you need to access Flowable\u2019s apps and adminer:<\/p>\n<ul style=\"text-align: justify;\">\n<li>flowable-rest: <a href=\"http:\/\/localhost:9977\/flowable-rest\">http:\/\/localhost:9977\/flowable-rest<\/a><\/li>\n<li>flowable-rest-swagger: <a href=\"http:\/\/localhost:9977\/flowable-rest\/docs\">http:\/\/localhost:9977\/flowable-rest\/docs<\/a><\/li>\n<li>flowable-idm: <a href=\"http:\/\/localhost:8080\/flowable-idm\">http:\/\/localhost:8080\/flowable-idm<\/a><\/li>\n<li>flowable-task: <a href=\"http:\/\/localhost:9999\/flowable-task\">http:\/\/localhost:9999\/flowable-task<\/a><\/li>\n<li>flowable-modeler: <a href=\"http:\/\/localhost:8888\/flowable-modeler\">http:\/\/localhost:8888\/flowable-modeler<\/a><\/li>\n<li>flowable-admin: <a href=\"http:\/\/localhost:9988\/flowable-admin\">http:\/\/localhost:9988\/flowable-admin<\/a><\/li>\n<li>adminer: <a href=\"http:\/\/localhost:18080\/\">http:\/\/localhost:18080\/<\/a><\/li>\n<\/ul>\n<h2 style=\"text-align: justify;\">Summary<\/h2>\n<p style=\"text-align: justify;\">We hope that, even though this was a very basic introduction, you understood how to build and create a docker image of all of Flowable\u2019s app, and how to deploy them in a docker compose environment.<\/p>\n<p style=\"text-align: justify;\">Please feel free to contact us. We will gladly response to any doubt or question you might have.<\/p>\n<p style=\"text-align: justify;\">The full implementation of this article can be found in the <a href=\"https:\/\/github.com\/canchito-dev\/run-flowable-bpm-using-docker-and-mysql\">GitHub repository<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this article, you will learn how to compile Flowable source code using MySQL as database source, and generate valid Docker images. Once you have the images, we will use Docker Compose for defining and running a multi-container Docker applications.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[31,62,74,61,47],"tags":[18,63,75,34,64,10],"class_list":["post-356","post","type-post","status-publish","format-standard","hentry","category-bpm","category-docker","category-docker-compose","category-flowable-bpm","category-open-source","tag-bpm","tag-docker","tag-docker-compose","tag-flowable","tag-mysql","tag-open-source"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p8EwXo-5K","jetpack-related-posts":[{"id":423,"url":"http:\/\/www.canchito-dev.com\/public\/blog\/2020\/05\/13\/deploying-flowable-in-a-docker-container-and-mysql-part-1\/","url_meta":{"origin":356,"position":0},"title":"Deploying Flowable in a Docker Container and MySQL (Part 1)","author":"canchitodev","date":"May 13, 2020","format":false,"excerpt":"In this post, you will learn how to adapt Flowable's war files to use MySQL as a database source. Once this is done, we will deploy them in a dockerized environment.","rel":"","context":"In &quot;BPM&quot;","block_context":{"text":"BPM","link":"http:\/\/www.canchito-dev.com\/public\/blog\/category\/bpm\/"},"img":{"alt_text":"CANCHITO-DEV: Tomcat Manager App","src":"https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/05\/tomcat_manager_app.png?resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/05\/tomcat_manager_app.png?resize=350%2C200 1x, https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/05\/tomcat_manager_app.png?resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/05\/tomcat_manager_app.png?resize=700%2C400 2x, https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/05\/tomcat_manager_app.png?resize=1050%2C600 3x, https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/05\/tomcat_manager_app.png?resize=1400%2C800 4x"},"classes":[]},{"id":458,"url":"http:\/\/www.canchito-dev.com\/public\/blog\/2020\/05\/14\/deploying-flowable-in-a-docker-container-and-mysql-part-2\/","url_meta":{"origin":356,"position":1},"title":"Deploying Flowable in a Docker Container and MySQL (Part 2)","author":"canchitodev","date":"May 14, 2020","format":false,"excerpt":"This is the second part of our \"Deploying Flowable in a Docker Container and MySQL\" series. In this post, you will learn how to deploy Flowable's war files in a container running Tomcat, and connecting to another container running use MySQL database.","rel":"","context":"In &quot;BPM&quot;","block_context":{"text":"BPM","link":"http:\/\/www.canchito-dev.com\/public\/blog\/category\/bpm\/"},"img":{"alt_text":"CANCHITO-DEV: Tomcat Main","src":"https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/05\/tomcat_main_page-1.png?resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/05\/tomcat_main_page-1.png?resize=350%2C200 1x, https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/05\/tomcat_main_page-1.png?resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/05\/tomcat_main_page-1.png?resize=700%2C400 2x"},"classes":[]},{"id":477,"url":"http:\/\/www.canchito-dev.com\/public\/blog\/2020\/06\/27\/use-flowable-apps-with-a-custom-rest-api\/","url_meta":{"origin":356,"position":2},"title":"Use Flowable Apps with a Custom REST API","author":"canchitodev","date":"June 27, 2020","format":false,"excerpt":"In this post, you will learn how configure Flowable's apps to use your custom Spring Boot REST API as a backend engine. All this, in a dockerized environment.","rel":"","context":"In &quot;BPM&quot;","block_context":{"text":"BPM","link":"http:\/\/www.canchito-dev.com\/public\/blog\/category\/bpm\/"},"img":{"alt_text":"CANCHITO-DEV: Process engine deployments in Flowable Admin","src":"https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/05\/process-engine-deployments.png?resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/05\/process-engine-deployments.png?resize=350%2C200 1x, https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/05\/process-engine-deployments.png?resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/05\/process-engine-deployments.png?resize=700%2C400 2x, https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/05\/process-engine-deployments.png?resize=1050%2C600 3x"},"classes":[]},{"id":636,"url":"http:\/\/www.canchito-dev.com\/public\/blog\/2022\/01\/27\/collect-metrics-with-metricbet\/","url_meta":{"origin":356,"position":3},"title":"Collect Metrics with Metricbet","author":"canchitodev","date":"January 27, 2022","format":false,"excerpt":"Learn how you could use Metricbeat to monitor your servers by collecting metrics from the system and services running on the server.","rel":"","context":"In &quot;Beat&quot;","block_context":{"text":"Beat","link":"http:\/\/www.canchito-dev.com\/public\/blog\/category\/elk\/beat\/"},"img":{"alt_text":"CANCHITO-DEV: [Metricbeat System] Host overview ECS","src":"https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2022\/01\/metricbeat_system_dashboard__host_overview_ecs.png?resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2022\/01\/metricbeat_system_dashboard__host_overview_ecs.png?resize=350%2C200 1x, https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2022\/01\/metricbeat_system_dashboard__host_overview_ecs.png?resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2022\/01\/metricbeat_system_dashboard__host_overview_ecs.png?resize=700%2C400 2x, https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2022\/01\/metricbeat_system_dashboard__host_overview_ecs.png?resize=1050%2C600 3x, https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2022\/01\/metricbeat_system_dashboard__host_overview_ecs.png?resize=1400%2C800 4x"},"classes":[]},{"id":184,"url":"http:\/\/www.canchito-dev.com\/public\/blog\/2018\/03\/30\/asynchronous-service-invocation-using-flowable\/","url_meta":{"origin":356,"position":4},"title":"Asynchronous Service Invocation using Flowable","author":"canchitodev","date":"March 30, 2018","format":false,"excerpt":"In this article, I will explain one possible method to solved some \"limitations\" encountered during the integration and implementation of\u00a0Flowable BPM, when executing long-running tasks, by implementing the Signallable Flowable Behavior and a database table as a task queue. Similar behavior can be achieved using Flowable's send task and receive\u2026","rel":"","context":"In &quot;BPM&quot;","block_context":{"text":"BPM","link":"http:\/\/www.canchito-dev.com\/public\/blog\/category\/bpm\/"},"img":{"alt_text":"CANCHITO-DEV: Task Queue Service","src":"https:\/\/i0.wp.com\/canchito-dev.com\/img\/cwm\/userguide\/canchito_dev_task_queue_service.png?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":471,"url":"http:\/\/www.canchito-dev.com\/public\/blog\/2020\/06\/27\/flowable-custom-engine-configuration\/","url_meta":{"origin":356,"position":5},"title":"Customizing Flowable Engine","author":"canchitodev","date":"June 27, 2020","format":false,"excerpt":"In this article, we will go into detail on how to customize Flowable's engine. Three changes to the engine will be done: (1) Change the database connection by modifying the data source and adding custom data source properties. (2)Use a strong UUID generator. (3)Implement a custom event handler.","rel":"","context":"In &quot;BPM&quot;","block_context":{"text":"BPM","link":"http:\/\/www.canchito-dev.com\/public\/blog\/category\/bpm\/"},"img":{"alt_text":"CANCHITO-DEV: Spring Initializr","src":"https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/05\/initializr-1024x674.png?resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/05\/initializr-1024x674.png?resize=350%2C200 1x, https:\/\/i0.wp.com\/www.canchito-dev.com\/public\/blog\/wp-content\/uploads\/2020\/05\/initializr-1024x674.png?resize=525%2C300 1.5x"},"classes":[]}],"jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/www.canchito-dev.com\/public\/blog\/wp-json\/wp\/v2\/posts\/356","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.canchito-dev.com\/public\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.canchito-dev.com\/public\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.canchito-dev.com\/public\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.canchito-dev.com\/public\/blog\/wp-json\/wp\/v2\/comments?post=356"}],"version-history":[{"count":9,"href":"http:\/\/www.canchito-dev.com\/public\/blog\/wp-json\/wp\/v2\/posts\/356\/revisions"}],"predecessor-version":[{"id":538,"href":"http:\/\/www.canchito-dev.com\/public\/blog\/wp-json\/wp\/v2\/posts\/356\/revisions\/538"}],"wp:attachment":[{"href":"http:\/\/www.canchito-dev.com\/public\/blog\/wp-json\/wp\/v2\/media?parent=356"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.canchito-dev.com\/public\/blog\/wp-json\/wp\/v2\/categories?post=356"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.canchito-dev.com\/public\/blog\/wp-json\/wp\/v2\/tags?post=356"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}