diff --git a/pelican/tools/pelican_quickstart.py b/pelican/tools/pelican_quickstart.py index e6ccf2a8..ccf75ed0 100755 --- a/pelican/tools/pelican_quickstart.py +++ b/pelican/tools/pelican_quickstart.py @@ -43,7 +43,10 @@ CONF = { 'default_pagination': 10, 'siteurl': '', 'lang': 'en', - 'timezone': 'Europe/Paris' + 'timezone': 'Europe/Paris', + 'docker_base_image': 'nginx', + 'docker_target_dir': '/usr/share/nginx/html', + 'docker_container_name': 'pelican_site_container' } # url for list of valid timezones @@ -310,6 +313,22 @@ needed by Pelican. CONF['github_pages_branch'] = \ _GITHUB_PAGES_BRANCHES['project'] + docker = ask('Do you want to run your website using ' + 'a Docker container?', answer=bool, default=False) + + if docker: + CONF['docker_container_name'] = ask('What would you like to name ' + 'your container?', str_compat, + CONF['docker_container_name']) + CONF['docker_base_image'] = ask('What webserver image would you ' + 'like to base your container ' + 'on?', str_compat, + CONF['docker_base_image']) + CONF['docker_target_dir'] = ask('Where do you want to put your ' + 'web site on that server?', + str_compat, + CONF['docker_target_dir']) + try: os.makedirs(os.path.join(CONF['basedir'], 'content')) except OSError as e: @@ -397,6 +416,20 @@ needed by Pelican. except OSError as e: print('Error: {0}'.format(e)) + if docker: + try: + with codecs.open(os.path.join(CONF['basedir'], 'Dockerfile'), + 'w', 'utf-8') as fd: + conf_docker = dict() + for key, value in CONF.items(): + conf_docker[key] = repr(value) + + for line in get_template('Dockerfile'): + template = string.Template(line) + fd.write(template.safe_substitute(conf_docker)) + fd.close() + except OSError as e: + print('Error: {0}'.format(e)) print('Done. Your new project is available at %s' % CONF['basedir']) if __name__ == "__main__": diff --git a/pelican/tools/templates/Dockerfile.in b/pelican/tools/templates/Dockerfile.in new file mode 100644 index 00000000..90da8240 --- /dev/null +++ b/pelican/tools/templates/Dockerfile.in @@ -0,0 +1,2 @@ +FROM nginx +COPY output /usr/share/nginx/html diff --git a/pelican/tools/templates/fabfile.py.in b/pelican/tools/templates/fabfile.py.in index 5481f84f..ab17545e 100644 --- a/pelican/tools/templates/fabfile.py.in +++ b/pelican/tools/templates/fabfile.py.in @@ -23,6 +23,11 @@ env.cloudfiles_container = '$cloudfiles_container' # Github Pages configuration env.github_pages_branch = "$github_pages_branch" +# Docker configuration +env.docker_blog_image = '$docker_base_image-blog' +env.docker_target_dir = '$docker_target_dir' +env.docker_container_name = '$docker_container_name' + # Port for `serve` PORT = 8000 @@ -91,3 +96,29 @@ def gh_pages(): """Publish to GitHub Pages""" rebuild() local("ghp-import -b {github_pages_branch} {deploy_path} -p".format(**env)) + +def docker_rebuild(): + """Rebuild the pelican site for production and install in a docker image : + - Kill and remove any existing pelican_site container. + - Copy the site into the webserver base image, build a new pelican_site + container. + - Run our new container. + """ + clean() + preview() # Builds the production version of the site + + if local("docker ps -a | grep %s; exit 0" % + env.docker_container_name, capture=True) != "": + local("docker rm -f {docker_container_name}".format(**env)) + + +# Remove the existing blog docker image + if local("docker images | grep %s; exit 0" % + env.docker_blog_image, capture=True) != "" : + local("docker rmi {docker_blog_image}".format(**env)) + +# Now build and run the new image + local("docker build -t {docker_blog_image} .".format(**env)) + + local("docker run -d -p 80:80 --name {docker_container_name} \ + {docker_blog_image} ".format(**env))