# Installation based on Docker container

## Docker container prerequisites

Docker is installed on the host machine, please refer to [Docker documentation](https://docs.docker.com/engine/installation/) for more details.

<!-- section-warning -->
>**Warning:**
>
>Your user must be part of docker group. You can use following command to check it :
>```bash
>groups | grep docker
>```
>
>If not, please refer to [docker post install instructions](https://docs.docker.com/install/linux/linux-postinstall/).
>
>Here are a short recap of commands you must execute :
>
>```bash
>sudo groupadd docker
>sudo usermod -aG docker $USER
># Log out and log back in so that your group membership is re-evaluated
>
># You may also need to start docker service manually
>sudo service docker start
># or
>sudo systemctl start docker
>```
>
<!-- end-section-warning -->

## Get the container

Load the pre-build AGL SDK docker image including `xds-server`:

```bash
wget -O - http://iot.bzh/download/public/XDS/docker/docker_agl_worker-xds-latest.tar.xz | docker load
```

You should get `docker.automotivelinux.org/agl/worker-xds:X.Y` image

```bash
# List image that we just load
docker images "docker.automotivelinux.org/agl/worker-xds*"

REPOSITORY                                  TAG                 IMAGE ID            CREATED             SIZE
docker.automotivelinux.org/agl/worker-xds   5.0                 877979e534ff        3 hours ago         106MB
```

## Create and start a new container

Use provided script to create a new docker image and start a new container:

```bash
# Get script
wget -O xds-docker-create-container.sh 'https://gerrit.automotivelinux.org/gerrit/gitweb?p=src/xds/xds-server.git;a=blob_plain;f=scripts/xds-docker-create-container.sh;hb=master'

# Create new XDS worker container (-id option value should be changed when you get port conflict error)
bash ./xds-docker-create-container.sh -id 0

# Check that new container is running
docker ps | grep worker-xds
f67079db4339        docker.automotivelinux.org/agl/worker-xds:5.0   "/usr/bin/wait_for..."   About a minute ago   Up 34 seconds       0.0.0.0:8000->8000/tcp,0.0.0.0:10809->10809/tcp, 0.0.0.0:2222->22/tcp   agl-xds-HOSTNAME-0-USERNAME
```

This container exposes following ports:

| Port number | Description                                 |
|-------------|---------------------------------------------|
|     8000    | `xds-server`: serve XDS webapp and REST API |
|     2222    | ssh                                         |

This container also creates the following volumes (shared folders between
inside and outside docker):

| Directory on host | Directory inside docker | Comment |
|-------------------|-------------------------|---------|
| $HOME/xds-workspace | /home/devel/xds-workspace | XDS projects workspace location|
| $HOME/xds-workspace/.xdt_0 | /xdt | location to store SDKs |
| $USER_VOLUME | $USER_VOLUME | user path, see `--volume` option of `xds-docker-create-container.sh` script |

### Optional settings

**`--volume`**

You can add a new shared directory using `--volume` option in order
to use for example with Path-Mapping folder type.

```bash
# Create new XDS worker container and share extra '$HOME/my-workspace' directory
bash ./xds-docker-create-container.sh --volume /my-workspace:$HOME/my-workspace
```

**`--id`**

You can change docker used port with `-id` option

```bash
# Create new XDS worker container with a different port number
ID=3
bash ./xds-docker-create-container.sh -id ${ID}

# Check that new container is running (in example below id has been set to 3)
docker ps | grep worker-xds
f67079db4339        docker.automotivelinux.org/agl/worker-xds:5.0   "/usr/bin/wait_for..."   About a minute ago   Up 34 seconds       0.0.0.0:2225->22/tcp, 0.0.0.0:8003->8000/tcp, 0.0.0.0:10892->10809/tcp   agl-xds-3
```

<!-- section-warning -->
>**Warning:**
> Changing container id will impact the port number used to connect to xds-server.
> So you may need to adjust xds-agent config in order to match the right port number.
>
>In above example, with `id` set to 3, the export port number will be `8003` and >consequently
>you must define xds-server `url` in `xds-agent` configuration as follow:
>
>```json
>{
>    ...
>    "xdsServers": [
>      {
>        "url": "http://localhost:8003"
>      }
>    ],
>    ...
>}
>```
>
>See also [xds-agent configuration](../part-2/2_xds-agent/2_config.html) chapter for >more details.
<!-- end-section-warning -->

### Manually setup docker user id

<!-- section-note -->
**Note:**

If you used `xds-docker-create-container.sh` script to create XDS
docker container, user uid/gid inside docker has already been changed by this script.
<!-- end-section-note -->

If you plan to use **path-mapping sharing type for your projects**, you need to
have the same user id and group id inside and outside docker.

By default user and group name inside docker is set `devel` (id `1664`).

Use following commands to replace id `1664` with your user/group id:

```bash
# Set docker container name to use (usually agl-xds-xxx where xxx is USERNAME@MACHINENAME-IDX-NAME)
export CONTAINER_NAME=agl-xds-seb@laptop-0-seb
docker ps | grep -q ${CONTAINER_NAME} || echo "ERROR: No container name \"${CONTAINER_NAME}\" please set a valid CONTAINER_NAME before you continue"

# First kill all processes of devel user (including running xds-server)
docker exec ${CONTAINER_NAME} bash -c "/bin/loginctl kill-user devel"

# Change user and group id inside docker to match your ids
docker exec ${CONTAINER_NAME} bash -c "usermod -u $(id -u) devel"
docker exec ${CONTAINER_NAME} bash -c "groupmod -g $(id -g) devel"

# Update some files ownership
docker exec ${CONTAINER_NAME} bash -c "chown -R devel:devel /home/devel /tmp/xds*"

# Restart devel autologin service
docker exec ${CONTAINER_NAME} bash -c "systemctl restart autologin"

# Restart xds-server as a service (ssh port 2222 may depend on your container ID)
ssh -p 2222 devel@localhost -- "systemctl --user restart xds-server"
```

## Check if xds-server is running (open XDS webapp)

**`xds-server` is automatically started** as a user service on container startup.

If the container is running on your localhost, you can access to a basic web
application:

```bash
xdg-open http://localhost:8000
```

If needed you can status / stop / start  it manually using following commands:

```bash
# Status XDS server:
ssh -p 2222 devel@localhost systemctl --user status xds-server.service

# Stop XDS server
ssh -p 2222 devel@localhost systemctl --user stop xds-server.service

# Start XDS server
ssh -p 2222 devel@localhost systemctl --user start xds-server.service

# Get XDS server logs
ssh -p 2222 devel@localhost journalctl --user --unit=xds-server.service --output=cat
```

`xds-server` is now up and running, you can now install AGL SDKs, please refer
to next chapter named [Installing AGL SDKs](./3_install-sdks.html)

<!-- section-note -->
Please refer to [xds-server configuration](../part-2/1_xds-server/2_config.html) chapter for additional info about xds-server settings.
<!-- end-section-note -->