# Using with Docker

<p class="warning">
This article assumes you are familiar with Docker and know how to create images and containers.
</p>

You can create a Docker image to run Alfresco Content App in the container.

## Using public Docker images

You can find all latest images for ACA in the [alfresco-content-app]( https://hub.docker.com/r/alfresco/alfresco-content-app/) DockerHub repository.

### Tags

- `latest`: latest stable release (`master` branch), available with 1.1 release or later
- `development`: most recent code (`development` branch)

In addition, there are images for feature branches, pull requests and Travis CI builds.

### Example

You can run latest `development` build locally with the following command:

```sh
docker run -p 3000:80 alfresco/alfresco-content-app:development
```

The default image expects an ACS 5.2.2 or later running at port `8080`.
You may also need CORS settings to be applied for your ACS installation or image.

## Building from source code

You need to run the following commands to build the project from the source code:

```sh
npm install
npm run build
```

That produces a build in the "dist" folder that you can use with a Docker image.

<p class="tip">
Also, you may need to update the `dist/app.config.json` file with the settings relevant to your scenario.
</p>

## Creating an image

The Content Application provides a "Dockerfile" file in the repository root.
You can build the image with the following command:

```sh
docker image build -t content-app .
```

## Running image in a container

To run the image locally, you can use the following command:

```sh
docker container run -p 8888:80 --rm content-app
```

Navigate to "http://localhost:8888" to access the running application.

## Docker Compose file

You can also use the "docker-compose" file for local development and testing.
To build and run a container run the following command in the root project folder:

```sh
docker-compose up
```

To perform a cleanup operation, use the next command:

```sh
docker-compose down --rmi all
```

Navigate to "http://localhost:4200" to access the running application.

<p class="warning">
Please keep in mind that you should manually build the project every time you want to publish the image or run it locally with the container.
</p>

## Using with local ACS setup

If you run ACS at port 8080 as a Docker container (typical development configuration), you can use the following command to build the project before creating an image:

```sh
npm run build:dev
```

The command above updates the "dist/app.config.json" file to point the Content App to "http://localhost:8080" upon startup.
Alternatively, you can change the configuration file manually before generating an image.

So, the development workflow, in this case, is going to be:

```sh
npm run build:dev
docker-compose up
```

Navigate to "http://localhost:4200" to access the running application.

To perform a cleanup operation, use the next command:

```sh
docker-compose down --rmi all
```

## Publishing to Docker Hub

First of all, if you do not have a Docker Hub account, you can register here: https://hub.docker.com/, the registration is absolutely free.

Next, it is recommended that you get a clean build of the application:

```sh
npm install
npm run build:dev
```

The commands above are going to produce a fresh build that is stored in the `dist` folder.
At this point, you can make modifications to the final code in the `dist` folder if needed.
For example you may want to change the `app.config.json` file content.

Now you can build your first version of the image:

```sh
docker image build -t myaccount/content-app:1.0 .
```

Where `myaccount` is usually your Docker Hub account name.

<p class="warning">
Please note the ending "." symbol at the end of the command. It instructs the Docker to take current folder where the `Dockerfile` is located.
</p>

To publish the newly created image use the next command:

```sh
docker push myaccount/content-app:1.0
```

## Running from Docker Hub

To quickly test the published image, or run it on another machine, use the following command:

```sh
docker container run -p 80:80 --rm myaccount/content-app:1.0
```

The `--rm` switch means the Docker will cleanup the container and image data once you stop the process.

<p class="tip">
You may also want to remove your local image before trying out the Docker Hub:<br>
`docker image rm myaccount/content-app:1.0`
</p>