This is to help developers to get fast a running development environment for debugging.
To use it in production you may need to carefully review all configurations and adjust.
This Docker environment is to test/develop a Turbine app using a docker test database.
The build should take place outside the docker container.
It is based on one docker-compose.yml file and two Dockerfiles.
Docker compose uses currently two services: app (maven:3-jdk-8) and db (mysql:latest).
To run the build with maven do this outside of the container using following mvn command:
mvn install -Pdocker
cd <project>/target/docker-resources docker compose config
docker compose build --no-cache docker compose up
First time building might take a couple of minutes.
N.B. You may use the command docker compose or docker-compose, but will slightly different results.
<Set name="url">jdbc:mysql://db:3306/turbine</Set>
The app service uses later a volume, which maps to the local maven repository, which you may need/not need. The db service uses mysql-latest (currently 8.x), you may replace it with a fixed release tag.
If previously build, you may want to delete all volumes (this will delete all tables in /var/lib/mysql) and containers
docker-compose down -v
Build it
docker-compose build --no-cache
.. optionally build it separately docker-compose build --no-cache --build-arg DB_CONTEXT=./docker-resources/db db
.. building app service first/only requires removing the dependency in docker-compose.yml(comment depends_on: db) docker-compose build --no-cache app
DB_CONTEXT is set to allow starting the db container standalone (in folder db, e.g. with docker build --tag my-db .) to test it. CAVEAT: The db service is build and populated until now with hard coded data. It is a dependency for the service app (see app/Dockerfile).
Start both services in one step
docker-compose up
.. or doing it in background, requires second start command
docker-compose -d up docker-compose start
This will start first the db service, then the app service. Jetty is run exposing the webapp to http://localhost:8081/app. By default remote debugging is activated (port 9000), which could be removed/commented in docker-compose.yml. You could follow the logs with docker-compose logs -f app or docker-compose logs -f db.
Optionally Check system or cleanup, e.g. with docker-compose down, docker-compose down -v or docker sytem prune (removes any container on system).
If services are already installed, activate/start by docker-compose up
Example Logs:
[Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.25-1debian10 started. [Note] [Entrypoint]: Switching to dedicated user 'mysql' [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.25-1debian10 started. [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.25) starting as process 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. [System] [MY-013577] [InnoDB] InnoDB initialization has ended. [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed. [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel. [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory. [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.25' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL. Listening for transport dt_socket at address: 9000 [INFO] Scanning for projects... [INFO] [INFO] ------< org.apache.turbine.test.integrationtest:integrationtest >------- [INFO] Building My Turbine Web Application 1.0.0-SNAPSHOT [INFO] --------------------------------[ war ]--------------------------------- [INFO] [INFO] >>> jetty-maven-plugin:9.4.43.v20210629:run (default-cli) > test-compile @ integrationtest >>> [INFO] [INFO] --- torque-maven-plugin:5.1-SNAPSHOT:generate (torque-om) @ integrationtest --- [main] INFO | org.apache.torque.generator.control.Controller - readConfiguration() : Starting to read configuration files
Currently the docker-compose is generated once more, if starting the containers, this will overwrite m2repo and may result in errors.
If not yet done, build on the host with mvn clean install -f ../pom.xml -Pdocker.
docker-compose run --rm db /bin/sh
Extract data in db service
mysql -u root -h db -P 3306 -p
.. or
docker-compose exec db mysql -u root --password=... -e "show databases;" --build-arg DB_CONTEXT=./docker-resources/db docker-compose exec db sh -c 'exec mysqldump --all-databases -uroot -p...' --build-arg DB_CONTEXT=./docker-resources/db > dump.sql
This will start app and db (as it depends on app):
docker-compose run --rm app /bin/sh
In the container, check:
ls -la /myapp // should list pom.xml ...
You may have to replace in volume mapping for host repo path (maven localRepository) backslashes with slashes “/” in docker-compose.yml.
check COMPOSE_CONVERT_WINDOWS_PATHS, https://docs.docker.com/compose/reference/envvars/#compose_convert_windows_paths
If a image download fails, try Docker->Network->Update DNS to 8.8.8.8
ERROR, when starting docker-compose up/start: “for db Cannot start service db: driver failed programming external connectivity on endpoint docker-resources_db_1 or ERROR: for docker-resources_db_1 Cannot start service db: driver failed programming external connectivity on endpoint docker-resources_db_1 ... Error starting userland proxy: mkdir /port/tcp:0.0.0.0:13306:tcp:...:3306: input/output error”
Check file permissions of archetype generated files (chmod -R a+rw docker-resources, chmod -R a+rw src .
https://nickjanetakis.com/blog/setting-up-docker-for-windows-and-wsl-to-work-flawlessly
docker-compose rm -v
docker rmi $(docker images -q)
docker volume inspect <containerid> // delete intermediate images, volumes docker rmi $(docker images --filter "dangling=true" -q) docker volume rm $(docker volume ls -qf dangling=true) # or delete while building docker build --rm # cleans all containers docker system prune # stops all running containers docker stop $(docker ps -a -q)
This project is licensed under the Apache Software License 2.0