Build a Simple Image and Push it to the Registry:
#!/bin/bash -e
# Environment parameters which could be injected by Jenkins:
VERSION=1.2.3
FORCE=false # as provided by the jenkins build parameter type boolean
DOCKERFILE_DIR=docker # location where the dockerfile is located in the repository
DOCKER_REGISTRY=https://registry.tld:5000
IMAGE_NAME=john.doe/myapp
if [ "$FORCE" != "true" ]; then
TAG_COUNT=$(curl -s --insecure -X GET ${DOCKER_REGISTRY}/v2/${IMAGE_NAME}/tags/list | grep \"${VERSION}\" | wc -l)
if [ "$TAG_COUNT" -ne "0" ]; then
echo "Tag is already on the registry!"
exit -1
fi
fi
cd $DOCKERFILE_DIR
echo Building ${IMAGE_NAME}:${VERSION}...
sed "s/##VERSION##/${VERSION}/" Dockerfile.in > Dockerfile;
docker build -t=${IMAGE_NAME} .
docker tag -f ${IMAGE_NAME} ${IMAGE_NAME}:${VERSION}
docker tag -f ${IMAGE_NAME} ${DOCKER_REGISTRY}/${IMAGE_NAME}:${VERSION}
docker push ${DOCKER_REGISTRY}/${IMAGE_NAME}:${VERSION}
Installation of the application with systemd and docker
#!/bin/bash -e
# Environment parameters which could be injected by Jenkins:
DOCKER_REGISTRY=https://registry.tld:5000
IMAGE_NAME=john.doe/myapp
VERSION=1.2.3
DOCKER_CONTAINER_NAME=myapp
cat > /etc/sysconfig/${DOCKER_CONTAINER_NAME} << EOF
DOCKER_IMAGE=${IMAGE_NAME}:${VERSION}
DOCKER_CONTAINER_NAME=${DOCKER_CONTAINER_NAME}
LOCAL_DIR=/data/${DOCKER_CONTAINER_NAME}
OTHER_OPTIONS=something
EOF
cat > /usr/lib/systemd/system/${DOCKER_CONTAINER_NAME}.service << EOF
[Unit]
Description=Some description here...
Requires=docker.service
After=docker.service
[Service]
Restart=on-failure
RestartSec=10
TimeoutStartSec=0
EnvironmentFile=-/etc/sysconfig/${DOCKER_CONTAINER_NAME}
ExecStartPre=-/usr/bin/docker kill \${DOCKER_CONTAINER_NAME}
ExecStartPre=-/usr/bin/docker rm \${DOCKER_CONTAINER_NAME}
ExecStartPre=/usr/bin/docker pull \${DOCKER_IMAGE}
ExecStart=/usr/bin/docker run --name \${DOCKER_CONTAINER_NAME} \
-p 8080:8080 \
-e "OTHER_OPTIONS=\${OTHER_OPTIONS}" \
-v \${LOCAL_DIR}:/data \
-v /etc/localtime:/etc/localtime:ro \
\${DOCKER_IMAGE}
ExecStop=/usr/bin/docker stop --time=10 \${DOCKER_CONTAINER_NAME}
[Install]
WantedBy=multi-user.target
EOF
Starting the application with the new version on a host:
#!/bin/bash -e
# Environment parameters which could be injected by Jenkins:
VERSION=1.2.3
DOCKER_REGISTRY=https://registry.tld:5000
IMAGE_NAME=john.doe/myapp
DOCKER_CONTAINER_NAME=myapp # is equal to service name
cat > /etc/sysconfig/${DOCKER_CONTAINER_NAME} << EOF
DOCKER_IMAGE=${IMAGE_NAME}:$VERSION
LOCAL_DIR=/data/${DOCKER_CONTAINER_NAME}
OTHER_OPTIONS=something
EOF
echo "#######################################################"
echo "# Starting with the following config options: #"
echo "#######################################################"
cat /etc/sysconfig/${DOCKER_CONTAINER_NAME}
echo
systemctl restart ${DOCKER_CONTAINER_NAME}
echo "#######################################################"
echo "# Status #"
echo "#######################################################"
systemctl status ${DOCKER_CONTAINER_NAME}
Docker tail until server is up
#!/bin/bash -e
# Environment parameters which could be injected by Jenkins:
DOCKER_CONTAINER_NAME=myapp
echo "\nLogs from docker container ${DOCKER_CONTAINER_NAME}:"
timeout 120 sh -c 'docker logs -f ${DOCKER_CONTAINER_NAME} 2>&1 | { sed "/Server startup in/ q" && kill $$ ;}' || true