You are here

Continuous Delivery Workflow example with Docker Docker-Compose and Ansible part 2

Previous Posts related to this one:
http://hpuxtips.es/?q=content/docker-using-docker-compose-build-lamp-dev...
http://hpuxtips.es/?q=content/continuous-delivery-workflow-example-docke...

Git repo with all the files we work with in these posts:
https://github.com/likid0/CDdockerAnsible

To continue with our Journey our next stage is the release stage.

In this stage our goals are:

1. Create a release image, that is a candidate for use in production.
2. Create a release enviroment as similar as posible to our production deployment
3. Run acceptance tests, to verify the App is ready for deployment.

We create a docker/release dir in our app tree:

[liquid@liquid-ibm:lamp-docker/liquid-app]$ tree                                                                                                                                         (10-28 09:51)
.
├── docker
│   ├── dev
│   │   ├── docker-compose.yml
│   │   └── Dockerfile
│   └── release
│       ├── docker-compose.yml
│       └── Dockerfile
├── Makefile
├── scripts
│   └── run-script.sh
└── src
    └── index.php

1. Create a release image

We are going to create a Docker file:

[liquid@liquid-ibm:liquid-app/docker]$ tree release                                                                                                                                      (10-28 09:53)
release
├── docker-compose.yml
└── Dockerfile

0 directories, 2 files

The difference between our dev Dockerfile is that we have removed the script to run tests, we also don't bind mount the app from the docker host.
What we do is copy the app to /var/www/html/ in the container, this way it's self contained.

[liquid@liquid-ibm:liquid-app/docker]$ cat release/Dockerfile                                                                                                                            (10-28 09:53)
FROM eboraas/apache-php

MAINTAINER Daniel Alexander Parkes
LABEL version="0.2"

RUN  echo 'export DBNAME=${DBNAME}\n\
export DBUSER=${DBUSER}\n\
export DBPASS=${DBPASS}\n\
export DBHOST=${DBHOST}\n' >> /etc/apache2/envvars

RUN sed -i -e 's/DirectoryIndex.*$/DirectoryIndex index.php/g' /etc/apache2/mods-available/dir.conf && rm /etc/apache2/sites-enabled/default-ssl.conf


EXPOSE 80 
VOLUME /var/www/html/
COPY src/index.php /var/www/html/

CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND" ]

2. Create the release enviroment.

Lets create a new docker-compose yml file for the enviroment release:

[liquid@liquid-ibm:liquid-app/docker]$ cat release/docker-compose.yml                                                                                                                    (10-28 09:59)
version: '2'

volumes:
  datavol:
    driver: local

services:
  web:
    build: 
      context: ../../
      dockerfile: docker/release/Dockerfile
    volumes:
      - datavol:/var/www/html
    links:
      - db
    environment:
      DBNAME: liquidapp
      DBUSER: liquiduser
      DBPASS: liquiduser
      DBHOST: db
  db: 
    image: mysql:5.6
    hostname: db
    expose:
      - "3306"
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_USER: liquiduser
      MYSQL_PASSWORD: liquiduser
      MYSQL_DATABASE: liquidapp
  lb:
    image: dockercloud/haproxy
    links:
      - web
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - 80:80

  agent-db:
    image: ansible-agent
    links:
      - db
    environment:
      PROBE_HOST: "db"
      PROBE_PORT: "3306"

  agent-lb:
    image: ansible-agent
    links:
      - lb
    environment:
      PROBE_HOST: "lb"
      PROBE_PORT: "80"

  test:
    image: reltester
    links:
      - lb
[liquid@liquid-ibm:liquid-app/docker]$ cat release/docker-compose.yml                                                                                                                    (10-28 09:59)
version: '2'

#We create a volume to store the app
volumes:
  datavol:
    driver: local

services:
  web:
    build: 
      context: ../../
# we point to our release docker file
      dockerfile: docker/release/Dockerfile
# We mount our data volume in the /var/www/html path of the web service
    volumes:
      - datavol:/var/www/html
    links:
      - db
    environment:
      DBNAME: liquidapp
      DBUSER: liquiduser
      DBPASS: liquiduser
      DBHOST: db
  db: 
    image: mysql:5.6
    hostname: db
    expose:
      - "3306"
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_USER: liquiduser
      MYSQL_PASSWORD: liquiduser
      MYSQL_DATABASE: liquidapp
# We add a load balancer service, replicating our production env
  lb:
    image: dockercloud/haproxy
    links:
      - web
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - 80:80

# database agent that checks it has started
  agent-db:
    image: ansible-agent
    links:
      - db
    environment:
      PROBE_HOST: "db"
      PROBE_PORT: "3306"
# Load balancer agent that checks it has started
  agent-lb:
    image: ansible-agent
# we link it with lb service
    links:
      - lb
# and we probe for port 80 if the LB
    environment:
      PROBE_HOST: "lb"
      PROBE_PORT: "80"

With this configuration we have our enviroment release enviroment ready, let's test it's all working:

[liquid@liquid-ibm:docker/release]$ docker-compose run --rm agent-db                                                                                                                     (10-28 10:07)
Creating network "release_default" with the default driver
Creating release_db_1
 [WARNING]: provided hosts list is empty, only localhost is available


PLAY [Probe a service via tcp port] ********************************************

TASK [Set facts] ***************************************************************
ok: [localhost]

TASK [Waiting for DB] **********************************************************
ok: [localhost -> localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0   

[liquid@liquid-ibm:docker/release]$ docker-compose up -d --build lb                                                                                                                      (10-28 10:07)
Building web
Step 1 : FROM eboraas/apache-php
 ---> 13709ea94f50
Step 2 : MAINTAINER Daniel Alexander Parkes
 ---> Using cache
 ---> 45733281b488
Step 3 : LABEL version "0.2"
 ---> Using cache
 ---> 545d228d1855
Step 4 : RUN echo 'export DBNAME=${DBNAME}\nexport DBUSER=${DBUSER}\nexport DBPASS=${DBPASS}\nexport DBHOST=${DBHOST}\n' >> /etc/apache2/envvars
 ---> Using cache
 ---> 1dc9e95f16c5
Step 5 : RUN sed -i -e 's/DirectoryIndex.*$/DirectoryIndex index.php/g' /etc/apache2/mods-available/dir.conf && rm /etc/apache2/sites-enabled/default-ssl.conf
 ---> Using cache
 ---> e10f1ad92762
Step 6 : EXPOSE 80
 ---> Using cache
 ---> 537b0643cbee
Step 7 : COPY src/index.php /var/www/html/
 ---> Using cache
 ---> 403895e9a291
Step 8 : CMD /usr/sbin/apache2ctl -D FOREGROUND
 ---> Using cache
 ---> 66e734c1c02d
Successfully built 66e734c1c02d
release_db_1 is up-to-date
Creating release_web_1
Creating release_lb_1
[liquid@liquid-ibm:docker/release]$ docker-compose run --rm agent-lb                                                                                                                     (10-28 10:07)
 [WARNING]: provided hosts list is empty, only localhost is available


PLAY [Probe a service via tcp port] ********************************************

TASK [Set facts] ***************************************************************
ok: [localhost]

TASK [Waiting for DB] **********************************************************
ok: [localhost -> localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0   

Ok, so no errors, lets check:

[liquid@liquid-ibm:docker/release]$ docker ps                                                                                                                                            (10-28 10:08)
CONTAINER ID        IMAGE                 COMMAND                  CREATED              STATUS              PORTS                                   NAMES
4e73562c0310        dockercloud/haproxy   "/sbin/tini -- docker"   38 seconds ago       Up 38 seconds       443/tcp, 0.0.0.0:80->80/tcp, 1936/tcp   release_lb_1
6d58150513da        release_web           "/usr/sbin/apache2ctl"   39 seconds ago       Up 38 seconds       80/tcp, 443/tcp                         release_web_1
4172665aaad1        mysql:5.6             "docker-entrypoint.sh"   About a minute ago   Up About a minute   3306/tcp                                release_db_1
[liquid@liquid-ibm:docker/release]$ docker inspect release_lb_1 | grep 172                                                                                                               (10-28 10:08)
                    "Gateway": "172.22.0.1",
                    "IPAddress": "172.22.0.4",
[liquid@liquid-ibm:docker/release]$ curl 172.22.0.4                                                                                                                                      (10-28 10:08)

LAMP application Test.

Table Hosts created successfully id: 1 - Name: 6d58150513da - IP: 172.22.0.3 - Mem: 16126220kB - kernel 4.7.9-200.fc24.x86_64

Ok so our Application is working running in the lamp release enviroment we created.

3. Run validation tests

We wan't to make sure our application works ok, so we have to run a suite of tests in the same way the final user will work with the APP.
In our case we wan't to check from and external server with and http request that the app is working and also that the request are being loadbalanced.

So we are going to create a new test docker image, that will execute a shell script that will run the tests.

[liquid@liquid-ibm:~/lamp-docker]$ ls                                                                                                                                                    (10-28 10:27)
ansible  liquid-app  README.md  reltester
[liquid@liquid-ibm:~/lamp-docker]$ tree reltester                                                                                                                                        (10-28 10:27)
reltester
├── Dockerfile
└── scripts
    └── release-tester.sh

1 directory, 2 files

The script just checks that in the output of the http request it recieves IPs from at least 3 servers.
This is obviously a stupid test for a stupid application, but You should get the Idea.

[liquid@liquid-ibm:~/lamp-docker]$ cat reltester/scripts/release-tester.sh                                                                                                               (10-28 10:30)
#!/bin/bash
curl lb >/dev/null 2>&1
if [ $? = 0 ] ; then
	for NUMBER in {1..80}
	do
		curl lb >/dev/null 2>&1
	done
else
	echo "Release tests FAILED"
	exit 1
fi
IPS=$(curl lb | grep IP | sort -u | wc -l)
if [ -n $IPS ] && [ $IPS -gt 2 ] ; then
	echo "Release tests passed OK"
else
	echo "Release tests FAILED"
	exit 1
fi

And our Dockerfile for the test container:

[liquid@liquid-ibm:~/lamp-docker]$ cat reltester/Dockerfile                                                                                                                              (10-28 10:31)
FROM fedora:latest
MAINTAINER Daniel Alexander Parkes

RUN dnf -y update && dnf -y clean all

COPY scripts/release-tester.sh /usr/local/bin/
RUN chmod 755 /usr/local/bin/release-tester.sh

CMD [ "release-tester.sh" ]

Ok, lets build the image.

[liquid@liquid-ibm:lamp-docker/reltester]$ docker build -t reltester .                                                                                                                   (10-28 10:32)
Sending build context to Docker daemon 3.584 kB
Step 1 : FROM fedora:latest
 ---> f9873d530588
Step 2 : MAINTAINER Daniel Alexander Parkes
 ---> Using cache
 ---> 8ddff494dba6
Step 3 : RUN dnf -y update && dnf -y clean all
 ---> Using cache
 ---> 8184552e81eb
Step 4 : COPY scripts/release-tester.sh /usr/local/bin/
 ---> Using cache
 ---> 1e3cefcd8990
Step 5 : RUN chmod 755 /usr/local/bin/release-tester.sh
 ---> Using cache
 ---> 24c283902589
Step 6 : CMD release-tester.sh
 ---> Using cache
 ---> 5b1bdbc155f6
Successfully built 5b1bdbc155f6

[liquid@liquid-ibm:lamp-docker/reltester]$ docker images  reltester                                                                                                                      (10-28 10:35)
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
reltester           latest              5b1bdbc155f6        17 hours ago        511 MB
 

Ok so lets add the test service to our docker-compose release file.

[liquid@liquid-ibm:docker/release]$ cat docker-compose.yml                                                                                                                               (10-28 10:36)
version: '2'

volumes:
  datavol:
    driver: local

services:
  web:
    build: 
      context: ../../
      dockerfile: docker/release/Dockerfile
    volumes:
      - datavol:/var/www/html
    links:
      - db
    environment:
      DBNAME: liquidapp
      DBUSER: liquiduser
      DBPASS: liquiduser
      DBHOST: db
  db: 
    image: mysql:5.6
    hostname: db
    expose:
      - "3306"
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_USER: liquiduser
      MYSQL_PASSWORD: liquiduser
      MYSQL_DATABASE: liquidapp
  lb:
    image: dockercloud/haproxy
    links:
      - web
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - 80:80

  agent-db:
    image: ansible-agent
    links:
      - db
    environment:
      PROBE_HOST: "db"
      PROBE_PORT: "3306"

  agent-lb:
    image: ansible-agent
    links:
      - lb
    environment:
      PROBE_HOST: "lb"
      PROBE_PORT: "80"

# We add this test service and we link it to the loadbalancer service 
  test:
    image: reltester
    links:
      - lb

No we are going to run the test image, we check we have our env up:

[liquid@liquid-ibm:docker/release]$ docker-compose ps                                                                                                                                    (10-28 10:40)
    Name                   Command               State                   Ports                 
----------------------------------------------------------------------------------------------
release_db_1    docker-entrypoint.sh mysqld      Up      3306/tcp                              
release_lb_1    /sbin/tini -- dockercloud- ...   Up      1936/tcp, 443/tcp, 0.0.0.0:80->80/tcp 
release_web_1   /usr/sbin/apache2ctl -D FO ...   Up      443/tcp, 80/tcp                       

We run the tests:

[liquid@liquid-ibm:docker/release]$ docker-compose run --rm test                                                                                                                         (10-28 10:40)
Release tests FAILED

We can see our tests fail because we only have 1 web service running, let's scale our webservices:

[liquid@liquid-ibm:docker/release]$ docker-compose scale web=3                                                                                                                           (10-28 10:40)
Creating and starting release_web_2 ... done
Creating and starting release_web_3 ... done
[liquid@liquid-ibm:docker/release]$ docker-compose run --rm test                                                                                                                         (10-28 10:44)
Release tests passed OK

Fine, the tests passed ok, let's add the workflow to our make file:


[liquid@liquid-ibm:lamp-docker/liquid-app]$ cat Makefile                                                                                                                                 (10-28 10:45)

REPO_NAME ?= liquidapp
DEV_PRO := liquidev
REL_PRO := liquidrel   ---> we add the release project
DEV_FILE := docker/dev/docker-compose.yml
REL_FILE := docker/release/docker-compose.yml   --> we add the release docker-compose file


.PHONY: devtest build release clean

devtest:
	
	@ echo "Pulling latest images..."
	@ docker-compose -p $(DEV_PRO) -f $(DEV_FILE) pull db 
	@ echo "Building images..."
	@ docker-compose -p $(DEV_PRO) -f $(DEV_FILE) build --pull web
	@ echo "Ensuring database is ready..."
	@ docker-compose -p $(DEV_PRO) -f $(DEV_FILE) run --rm agent
	@ echo "Running tests..."
	@ docker-compose -p $(DEV_PRO) -f $(DEV_FILE) up web

release:
	@ echo "Starting release env"
	@ echo "Building images..."
	@ docker-compose -p $(REL_PRO) -f $(REL_FILE) build web   --> we don't add the pull option, we need to work with the same versions as in dev
	@ echo "Ensuring database is ready..."
	@ docker-compose -p $(REL_PRO) -f $(REL_FILE) run --rm agent-db
	@ echo "Starting release env services"
	@ docker-compose -p $(REL_PRO) -f $(REL_FILE) up -d lb
	@ echo "Ensuring HAproxy is ready..."
	@ docker-compose -p $(REL_PRO) -f $(REL_FILE) run --rm agent-lb
	@ echo "Scaling web services"
	@ docker-compose -p $(REL_PRO) -f $(REL_FILE) scale web=3   --> here we scale and then run tests
	@ echo "Running tests..."
	@ docker-compose -p $(REL_PRO) -f $(REL_FILE) run --rm test


clean:
	@ echo "Destroying dev env"
	@ docker-compose -p $(DEV_PRO) -f $(DEV_FILE) kill
	@ docker-compose -p $(DEV_PRO) -f $(DEV_FILE) rm --all -f -v
	@ echo "Destroying Release env" ---> here we add the release env to also clean it up
	@ docker-compose -p $(REL_PRO) -f $(REL_FILE) kill
	@ docker-compose -p $(REL_PRO) -f $(REL_FILE) rm --all -f -v
	@ echo "Removing dangling objects"
	@ docker images -q -f dangling=true -f label=application=$(REPO_NAME) | xargs -I ARGS docker rmi -f ARGS
	@ echo "Clean complete"


Let's test the full workflow, dev and release:

[liquid@liquid-ibm:lamp-docker/liquid-app]$ docker ps                                                                                                                                    (10-28 10:53)
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[liquid@liquid-ibm:lamp-docker/liquid-app]$ make devtest                                                                                                                                 (10-28 10:53)
Pulling latest images...
Pulling db (mysql:5.6)...
5.6: Pulling from library/mysql
Digest: sha256:b714e9bd05f38877832a976813dec03650c3f4a4b09cd23652a85efd41ae6cd8
Status: Image is up to date for mysql:5.6
Building images...
Building web
Step 1 : FROM eboraas/apache-php
latest: Pulling from eboraas/apache-php
Digest: sha256:bea84cdde1a4489c41d6dc125804663631f58aea5d00d9df0ef8af2dd1c5e3ff
Status: Image is up to date for eboraas/apache-php:latest
 ---> eb51da88ee48
Step 2 : MAINTAINER Daniel Alexander Parkes
 ---> Using cache
 ---> 4fa486f31c1a
Step 3 : LABEL version "0.2"
 ---> Using cache
 ---> fb589b85cfac
Step 4 : RUN echo 'export DBNAME=${DBNAME}\nexport DBUSER=${DBUSER}\nexport DBPASS=${DBPASS}\nexport DBHOST=${DBHOST}\n' >> /etc/apache2/envvars
 ---> Using cache
 ---> e9265f57344e
Step 5 : RUN sed -i -e 's/DirectoryIndex.*$/DirectoryIndex index.php/g' /etc/apache2/mods-available/dir.conf && rm /etc/apache2/sites-enabled/default-ssl.conf
 ---> Using cache
 ---> 18f55f7d78d7
Step 6 : COPY scripts/run-script.sh /usr/local/bin/run-script.sh
 ---> Using cache
 ---> 7865ddc0fc49
Step 7 : RUN chmod +x /usr/local/bin/run-script.sh
 ---> Using cache
 ---> bb17e0dcaed5
Step 8 : EXPOSE 80
 ---> Using cache
 ---> 6acd6cd441c0
Step 9 : ENTRYPOINT run-script.sh
 ---> Using cache
 ---> 6d902184306a
Step 10 : CMD start
 ---> Using cache
 ---> 7c9f5988ac90
Successfully built 7c9f5988ac90
Ensuring database is ready...
Creating liquidev_db_1
 [WARNING]: provided hosts list is empty, only localhost is available


PLAY [Probe a service via tcp port] ********************************************

TASK [Set facts] ***************************************************************
ok: [localhost]

TASK [Waiting for DB] **********************************************************
ok: [localhost -> localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0   

Running tests...
liquidev_db_1 is up-to-date
Creating liquidev_web_1
Attaching to liquidev_web_1
web_1    | PHP app Test Passed OK
liquidev_web_1 exited with code 0

Dev tests pass ok


[liquid@liquid-ibm:lamp-docker/liquid-app]$ make release                                                                                                                                 (10-28 10:53)
Starting release env
Building images...
Building web
Step 1 : FROM eboraas/apache-php
 ---> eb51da88ee48
Step 2 : MAINTAINER Daniel Alexander Parkes
 ---> Using cache
 ---> 4fa486f31c1a
Step 3 : LABEL version "0.2"
 ---> Using cache
 ---> fb589b85cfac
Step 4 : RUN echo 'export DBNAME=${DBNAME}\nexport DBUSER=${DBUSER}\nexport DBPASS=${DBPASS}\nexport DBHOST=${DBHOST}\n' >> /etc/apache2/envvars
 ---> Using cache
 ---> e9265f57344e
Step 5 : RUN sed -i -e 's/DirectoryIndex.*$/DirectoryIndex index.php/g' /etc/apache2/mods-available/dir.conf && rm /etc/apache2/sites-enabled/default-ssl.conf
 ---> Using cache
 ---> 18f55f7d78d7
Step 6 : EXPOSE 80
 ---> Using cache
 ---> 5671069b8619
Step 7 : COPY src/index.php /var/www/html/
 ---> Using cache
 ---> fdce61312326
Step 8 : CMD /usr/sbin/apache2ctl -D FOREGROUND
 ---> Using cache
 ---> 9af40fbe6698
Successfully built 9af40fbe6698
Ensuring database is ready...
Creating liquidrel_db_1
 [WARNING]: provided hosts list is empty, only localhost is available


PLAY [Probe a service via tcp port] ********************************************

TASK [Set facts] ***************************************************************
ok: [localhost]

TASK [Waiting for DB] **********************************************************
ok: [localhost -> localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0   

Starting release env services
liquidrel_db_1 is up-to-date
Creating liquidrel_web_1
Creating liquidrel_lb_1
Ensuring HAproxy is ready...
 [WARNING]: provided hosts list is empty, only localhost is available


PLAY [Probe a service via tcp port] ********************************************

TASK [Set facts] ***************************************************************
ok: [localhost]

TASK [Waiting for DB] **********************************************************
ok: [localhost -> localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0   

Scaling web services
Creating and starting liquidrel_web_2 ... done
Creating and starting liquidrel_web_3 ... done
Running tests...
Release tests passed OK


Release tests pass OK!, lets clean up.


[liquid@liquid-ibm:lamp-docker/liquid-app]$ make clean                                                                                                                                   (10-28 10:54)
Destroying dev env
Killing liquidev_db_1 ... done
Going to remove liquidev_web_1, liquidev_db_1
Removing liquidev_web_1 ... done
Removing liquidev_db_1 ... done
Destroying Release env
Killing liquidrel_web_3 ... done
Killing liquidrel_web_2 ... done
Killing liquidrel_lb_1 ... done
Killing liquidrel_web_1 ... done
Killing liquidrel_db_1 ... done
Going to remove liquidrel_web_3, liquidrel_web_2, liquidrel_lb_1, liquidrel_web_1, liquidrel_db_1
Removing liquidrel_web_3 ... done
Removing liquidrel_web_2 ... done
Removing liquidrel_lb_1 ... done
Removing liquidrel_web_1 ... done
Removing liquidrel_db_1 ... done
Removing dangling objects
Clean complete

Ok, so we have our release stage ready, on the next post we will publish our app to github and our app docker image to dockerhub, then we will configure dockerhubs autobuild feature, and then add our workflow to jenkins.

Unix Systems: 

Add new comment

Filtered HTML

  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.
By submitting this form, you accept the Mollom privacy policy.
Error | HP-UX Tips & Tricks Site

Error

Error message

  • Warning: Cannot modify header information - headers already sent by (output started at /homepages/37/d228974590/htdocs/includes/common.inc:2567) in drupal_send_headers() (line 1207 of /homepages/37/d228974590/htdocs/includes/bootstrap.inc).
  • PDOException: SQLSTATE[42000]: Syntax error or access violation: 1142 INSERT command denied to user 'dbo229817041'@'217.160.155.192' for table 'watchdog': INSERT INTO {watchdog} (uid, type, message, variables, severity, link, location, referer, hostname, timestamp) VALUES (:db_insert_placeholder_0, :db_insert_placeholder_1, :db_insert_placeholder_2, :db_insert_placeholder_3, :db_insert_placeholder_4, :db_insert_placeholder_5, :db_insert_placeholder_6, :db_insert_placeholder_7, :db_insert_placeholder_8, :db_insert_placeholder_9); Array ( [:db_insert_placeholder_0] => 0 [:db_insert_placeholder_1] => cron [:db_insert_placeholder_2] => Attempting to re-run cron while it is already running. [:db_insert_placeholder_3] => a:0:{} [:db_insert_placeholder_4] => 4 [:db_insert_placeholder_5] => [:db_insert_placeholder_6] => http://www.hpuxtips.es/?q=content/continuous-delivery-workflow-example-docker-docker-compose-and-ansible-part-2 [:db_insert_placeholder_7] => [:db_insert_placeholder_8] => 54.198.71.184 [:db_insert_placeholder_9] => 1503242198 ) in dblog_watchdog() (line 157 of /homepages/37/d228974590/htdocs/modules/dblog/dblog.module).
The website encountered an unexpected error. Please try again later.