This is an automated email from the ASF dual-hosted git repository. gk pushed a commit to branch docker in repository https://gitbox.apache.org/repos/asf/turbine-archetypes.git
commit 5ba6ae615d0dc84a4f42184671846a7bd0e50c2f Author: Georg Kallidis <[email protected]> AuthorDate: Tue Jan 15 11:28:30 2019 +0100 cleanup and fix build process; explicitely build artifacts outside container, current focus on integrationtest project build --- .../docker-resources/app/Dockerfile | 4 +- .../docker-resources/db/Dockerfile | 23 +++++--- .../docker-resources/docker-compose.yml | 23 +++++--- .../archetype-resources/docker-resources/readme.md | 66 +++++++++++++--------- 4 files changed, 74 insertions(+), 42 deletions(-) diff --git a/src/main/resources/archetype-resources/docker-resources/app/Dockerfile b/src/main/resources/archetype-resources/docker-resources/app/Dockerfile index c241859..e1022d2 100644 --- a/src/main/resources/archetype-resources/docker-resources/app/Dockerfile +++ b/src/main/resources/archetype-resources/docker-resources/app/Dockerfile @@ -10,6 +10,8 @@ ADD src/ /myapp/src/ WORKDIR /myapp -# build app outside docker, if you use snapshots +# build app outside docker # no build stage volumes: https://github.com/moby/moby/issues/38366 +# run build process outside, requires having maven and java installed in host system. +# uncomment only, if you have NO snapshots and you a reason to build it inside the container # RUN mvn -f /myapp/pom.xml clean package diff --git a/src/main/resources/archetype-resources/docker-resources/db/Dockerfile b/src/main/resources/archetype-resources/docker-resources/db/Dockerfile index 45dacda..555e234 100644 --- a/src/main/resources/archetype-resources/docker-resources/db/Dockerfile +++ b/src/main/resources/archetype-resources/docker-resources/db/Dockerfile @@ -1,7 +1,7 @@ #using multi-stage # mariadb use docker-entrypoint -FROM mysql:latest as builder +FROM mysql:latest as builder # That file does the DB initialization but also runs mysql daemon, by removing the last line it will only init RUN ["/bin/sed", "-i", "s/exec \"$@\"/echo \"not running $@\"/", "/usr/local/bin/docker-entrypoint.sh"] @@ -12,6 +12,13 @@ RUN ["/bin/sed", "-i", "s/exec \"$@\"/echo \"not running $@\"/", "/usr/local/bin # docker run <image> /usr/sbin/mysqld --verbose --help | grep -A 1 "Default options" ARG DB_CONTEXT +ARG MYSQL_DATABASE +ARG MYSQL_ROOT_PASSWORD +ARG MYSQL_RANDOM_ROOT_PASSWORD +ARG MYSQL_USER +ARG MYSQL_PASSWORD +ARG MYSQL_ONETIME_PASSWORD + # mount in docker-compose ADD #var("DB_CONTEXT:-.")/mysql/conf/my.cnf /etc/ @@ -31,15 +38,17 @@ ADD ./target/generated-sql/torque/mysql/*.sql ./data/ ADD ./docs/sample-mysql-data/*.sql ./data/ # required, to create -ENV DB_CONTEXT #var("DB_CONTEXT") -ENV MYSQL_DATABASE=${turbine_database_name} +ENV DB_CONTEXT ${DB_CONTEXT} +ENV MYSQL_DATABASE ${MYSQL_DATABASE} ENV MYSQL_ROOT=root -ENV MYSQL_ROOT_PASSWORD=default -ENV MYSQL_USER=${turbine_database_user} -ENV MYSQL_PASSWORD=${turbine_database_password} +ENV MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} + +ENV MYSQL_USER=${MYSQL_USER} +ENV MYSQL_PASSWORD=${MYSQL_PASSWORD} ENV MYSQL_HOST= -#ENV MYSQL_RANDOM_ROOT_PASSWORD yes +ENV MYSQL_RANDOM_ROOT_PASSWORD ${MYSQL_RANDOM_ROOT_PASSWORD} +ENV MYSQL_ONETIME_PASSWORD=${MYSQL_ONETIME_PASSWORD} # Need to change the datadir to something else that /var/lib/mysql because the parent docker file defines it as a volume. # https://docs.docker.com/engine/reference/builder/#volume : diff --git a/src/main/resources/archetype-resources/docker-resources/docker-compose.yml b/src/main/resources/archetype-resources/docker-resources/docker-compose.yml index acbf359..bbe4ca2 100644 --- a/src/main/resources/archetype-resources/docker-resources/docker-compose.yml +++ b/src/main/resources/archetype-resources/docker-resources/docker-compose.yml @@ -12,7 +12,8 @@ services: - MAVEN_OPTS=-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=9000 # this runs the app server in the container - command: mvn clean package jetty:run -Pdocker + #command: mvn clean package jetty:run -Pdocker + command: mvn jetty:run ports: - "8081:8081" - "8080:8080" @@ -38,16 +39,24 @@ services: context: ../ dockerfile: ./docker-resources/db/Dockerfile args: - - DB_CONTEXT=${DB_CONTEXT} + - DB_CONTEXT=./docker-resources/db + - MYSQL_DATABASE=turbine + #- MYSQL_ROOT_PASSWORD=default + - MYSQL_RANDOM_ROOT_PASSWORD=yes + - MYSQL_USER=db_user + - MYSQL_PASSWORD=db_password + - MYSQL_ONETIME_PASSWORD=false environment: - - MYSQL_DATABASE=${turbine_database_name} + - MYSQL_DATABASE=turbine - MYSQL_HOST= - - MYSQL_ROOT_PASSWORD=default - - MYSQL_USER=${turbine_database_user} - - MYSQL_PASSWORD=${turbine_database_password} + #- MYSQL_ROOT_PASSWORD=default + - MYSQL_RANDOM_ROOT_PASSWORD=yes + - MYSQL_USER=db_user + - MYSQL_PASSWORD=db_password - DB_CONTEXT=./docker-resources/db - #- MYSQL_RANDOM_ROOT_PASSWORD=yes + - MYSQL_ONETIME_PASSWORD=false + #- MYSQL_ALLOW_EMPTY_PASSWORD=yes volumes: - "./db/mysql/init:/docker-entrypoint-initdb.d" diff --git a/src/main/resources/archetype-resources/docker-resources/readme.md b/src/main/resources/archetype-resources/docker-resources/readme.md index 2453ed3..2f4c711 100644 --- a/src/main/resources/archetype-resources/docker-resources/readme.md +++ b/src/main/resources/archetype-resources/docker-resources/readme.md @@ -1,6 +1,10 @@ # Introduction -This docker environment is to test/develop a Turbine app using a docker test database. +This is to help developers to get fast a running development environment for debugging. + +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. @@ -10,9 +14,21 @@ Docker compose uses two services: **app** (maven:3-jdk-8) and **db** (mysql:late - Mysql should easily be replacable by Mariadb. - Instead of using maven as the app service a Jetty container might be the better choice as currently console reloading might not work. -# Installation +# Prepare + +To run the build with maven do this outside of the container using following mvn command: + +``` +mvn clean install -Pdocker +``` + +N.B.: This builds the integrationtest project in target/test-classes/projects/first/project/integrationtest with docker enabled configuration. +Running the build inside the container is not required and may be problematic, unless you use only public available dependencies. -- Change into docker resource folder + +# Installation (running the app) + +- Change into the projects docker resource folder ```sh cd docker-resources @@ -23,8 +39,8 @@ cd docker-resources - Check services in docker-compose.yml (volumes) ``` docker-compose config -``` -- Check **src/main/webapp/WEB-INF/jetty-env.xml**. It should reference the service name (db) not localhost. +``` +- Check database service call in **src/main/webapp/WEB-INF/jetty-env.xml**. It should reference the service name (db), not localhost - as it is also set in maven docker profile. ```xml <Set name="url">jdbc:mysql://db:3306/turbine</Set> @@ -32,30 +48,22 @@ docker-compose config ## Cleanup or restart (optional) -- Optionally Check system, Cleanup - - docker-compose ps - docker-compose down - docker-compose down -v +- 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 - -- or remove by - docker-compose down and docker-compose down -v -- Starting the app service will build the app and start jetty as a Maven install + Jetty start. -This command is set as a **command** in the app service in docker compose. -The docker profile should be activated by default (if not add -Pdocker). +- Starting the app service will build the app and start jetty with Maven on port 8081. +This command is set as a **command** in the app service in docker compose. -Optionally test the build process on the host with mvn clean install -f ../pom.xml. +If not yet done, build on the host with mvn clean install -f ../pom.xml -Pdocker. ### Build Services - - Set DB_CONTEXT=./docker-resources/db if not yet done for the db service on docker-compose.yml or provide as cli argument: +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, e.g. 5.6. - docker-compose build --no-cache --build-arg DB_CONTEXT=./docker-resources/db - .. or just build it + - Build it ```sh docker-compose build --no-cache @@ -68,8 +76,7 @@ Optionally test the build process on the host with mvn clean install -f ../pom.x 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. +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). @@ -85,9 +92,9 @@ docker-compose -d up docker-compose start ``` -This will start first the db service, then the app service. Jetty is run and exposes the webapp to **http://localhost:8081/app**. +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. +You could follow the logs with docker-compose logs -f app or docker-compose logs -f db. #### Lifecycle (developers only) @@ -126,17 +133,22 @@ ls -la /myapp // should list pom.xml ... ### Powershell -- Replace in volume path backslashes to slashes "/" in docker-compose.yml in localRepository +- Use Powershell + +- 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: for db Cannot start service db: driver failed programming external connectivity on endpoint docker-resources_db_1 .. +- 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 if containers not already running. - Remove containers (if any): docker rm $(docker ps -a -q) - - If error still there, restart Docker on your machine & restart it. + - If error still there, restart Docker Desktop on your machine. ### Windows Subsystem for Linux (WSL)
