Skip to content

vevovip/docker-vuejs

Repository files navigation

Vue + Docker Logo

A GitHub template to quickly start Vue.js application running in Docker

AboutDisclaimerGetting StartedHow To UseMake CommandsUseful TipsKnown IssuesLicense

About

These instructions will get you through the bootstrap phase of creating a containerised Vue.js application with Docker Compose.

This GitHub template will setup a Docker image with the following packages

Disclaimer

Please note: The Dockerfile provided is intended for use in local development environments. Please do not use this Dockerfile to deploy your Vue.js application in production environments.

Please visit Vue CLI Deployment Documentation for instructions on how to deploy on various platforms.

Getting started

Make sure that you have Docker and Docker Compose installed

How To Use

Creating a repository from this GitHub template

To create new projects using this GitHub template, you can click on the use this template button to create a new repository with this GitHub template.

Below is how your Vue.js project repository is structured. Your Vue.js code will be stored in the code folder.

.
├── .env
├── docker-compose.yaml
├── Makefile
├── README.md
└── docker
    └── Dockerfile
└── code
    └── ...

Setup Docker environment

Before you setup a new Vue.js application, you will need to create an .env file for the Docker Compose file to use. This will allow you to customise your docker setup without having to manually override the Dockerfile and Docker Compose file.

This GitHub template includes a .env.example which you can copy from. You can run the following command in your terminal.

# Create .env from .env.example.
$ cp .env.example .env

Your .env needs to have the following environment variables.

# Variable Description Example Value
1 DOCKER_USERNAME Docker hub username luisaveiro
2 PROJECT_NAME Project name website
3 CONTAINER_NAME Docker container name website.local
4 IMAGE_NAME Image tag website
5 NODE_VERSION Node Docker Version latest
6 PROJECT_PATH Project directory in Docker image & container website
7 ENABLE_TYPESCRIPT Add TypeScript support in Docker image true
8 NETWORK Docker container network front-end
9 VUE_UI_PORT Port used for the UI server 8000
10 VUE_UI_HOST Host used for the UI server 0.0.0.0

Running Docker container

Once you have updated the .env as per your requirements. You can run docker compose up or use the make dev-start alias command to create your Docker environment.

Example of the terminal output
$ make dev-start
docker-compose -f docker-compose.yml up
Creating network "front-end" with the default driver
Creating volume "website.local_node_modules" with default driver
Building web
Step 1/11 : FROM node:14.11.0-alpine3.12
...
Successfully tagged luisaveiro/website:latest
WARNING: Image for service web was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating website.local ... done
Attaching to website.local
website.local | 🚀  Starting GUI...
website.local | 🌠  Ready on http://0.0.0.0:8000
website.local | 8000

Once Docker compase as started your Docker Container, you can navigate to http://localhost: <port> in your web browser to access the Vue UI web server.

You can access the Docker container terminal by using the make ssh alias command.

$ make ssh
# docker exec -t -i website.local /bin/sh
/var/www/website

Once you have accessed your Docker container terminal, you will need to run the vue create . command. This will create a new Vue.js application in the current directory, which is the volume mounted to your code folder.

Example of the terminal output
$ vue create .

Vue CLI v4.5.6
? Generate project in current directory? (Y/n) y
...

Vue CLI v4.5.6
✨  Creating project in /var/www/website.
⚙️  Installing CLI plugins. This might take a while...
...
success Saved lockfile.
Done in 15.19s.
⚓  Running completion hooks...

📄  Generating README.md...

🎉  Successfully created project website.
👉  Get started with the following commands:

 $ yarn serve

Once Vue CLI has created your new Vue.js application, you will able to access your code in the code folder of your repository.

Import Vue.js project into Vue UI

Once you have a Vue.js project (new or existing), you can import your Vue.js project using Vue UI import function. You will be able to use all the Vue UI functionality for you Vue.js application.

Enabling Hot-Reloading with vue-cli-service serve

To enable Hot-Reloading in your Docker container when using the Vue UI serve task; you will need to include devServer.watchOptions in your vue.config.js file. This GitHub template includes a vue.config.js file in the code folder or you can copy the code below.

module.exports = {
  devServer: {
    watchOptions: {
      poll: true,
    },
  },
};

Make Commands

This GitHub template includes Makefile. A Makefile is a file containing a set of directives used by a make build automation tool to generate a target/goal. The following commands are available for you interact with your Docker environment.

# Command Description
1 make clean Remove project Docker container, image, network, volume
2 make clean-yarn-cache Clean Yarn global cache
3 make dev-rebuild Rebuild Docker image and container with Docker compose
4 make dev-start Start Docker container with Docker compose
5 make image Build Docker image
6 make publish Publish Docker image to Docker Hub
7 make serve Run Docker container without Docker compose
8 make ssh Access Docker container terminal.
9 make stop Stop Docker container

Useful Tips

1. Visual Studio Code Extensions

If you use VS Code as your Development IDE, I recommend the following extensions.

Coding with Vue.js

Docker management

2. Self-assigned SSL Certificates

If you want to use HTTPS with your Vue.js application and not have browsers display a warning message about invalid SSL Certificate, you can use mkcert (By FiloSottile) tool.

mkcert is a simple tool for making locally-trusted development certificates. Once you have created you SSL Certificate with mkcert, you will need to copy the files into your Docker container and update your vue.config.js file.

Below is an example of the additional settings you need to include.

module.exports = {
  devServer: {
    http2: true,
    https: {
      key: fs.readFileSync('/path/to/local.key'),
      cert: fs.readFileSync('/path/to/local.crt'),
    },
  },
};

Known issues

1. Vue UI is unable to generate a new project in current directory.

This is a limitation of Vue UI, please visit GitHub vue-cli issue #1509.

[Solution] Access Docker container terminal and run vue create . command.

2. Stopping Vue UI `serve task` causes the Vue UI server to crash and stops the docker container.

It seems the development server which is used by the serve task is linked to Vue UI web server. Below is the log of the Vue UI during the crash.

website.local | events.js:291
website.local |       throw er; // Unhandled 'error' event
website.local |       ^
website.local | 
website.local | Error: spawn /usr/local/share/.config/yarn/global/node_modules/@vue/cli-ui/apollo-server/util/terminate.sh ENOENT
website.local |     at Process.ChildProcess._handle.onexit (internal/child_process.js:268:19)
website.local |     at onErrorNT (internal/child_process.js:464:16)
website.local |     at processTicksAndRejections (internal/process/task_queues.js:80:21)
website.local | Emitted 'error' event on ChildProcess instance at:
website.local |     at Process.ChildProcess._handle.onexit (internal/child_process.js:274:12)
website.local |     at onErrorNT (internal/child_process.js:464:16)
website.local |     at processTicksAndRejections (internal/process/task_queues.js:80:21) {
website.local |   errno: -2,
website.local |   code: 'ENOENT',
website.local |   syscall: 'spawn /usr/local/share/.config/yarn/global/node_modules/@vue/cli-ui/apollo-server/util/terminate.sh',
website.local |   path: '/usr/local/share/.config/yarn/global/node_modules/@vue/cli-ui/apollo-server/util/terminate.sh',
website.local |   spawnargs: [ '77' ]
website.local | }
website.local exited with code 1

[Solution] re-run docker-compose up or make dev-start alias command to have everything running again.

3. Hot-Reloading with vue-cli-service serve is slow.

This is caused by the host-container file system configuration. Docker documentation provides information on Docker implementations of volume mount.

[Solution] run make clean-yarn-cache alias command or access the Docker container terminal and run yarn cache clean command. Running this command will clear the global cache. It will be populated again the next time yarn or yarn install is run.

License

The MIT License (MIT). Please see License File for more information.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published