Repository: AgnostiqHQ/covalent (language: python)

Issue:
Minor `README` fixes
### What should we add?

In `README.md` sometimes if the user directly copy-pastes the example code written, it might not work as expected. Two places where I found this were:

1. In `README.md` for the "Without and With Covalent" example, `result = ct.get_result(dispatch_id)`, here since the default value of `wait` parameter is `False`, this might not give the expected result because it didn't wait for the calculation to complete. So, simply changing it to `result = ct.get_result(dispatch_id, wait=True)` will do the trick.

2. In the same file, ideally we would like to increase the width of the `Without and With Covalent` table, using some markdown magic in order to fit the `dispatch_id = run_experiment.dispatch` in one line.

3. In `covalent_ui/README.md` the port number is mentioned as `48008` whereas now the UI server runs at `47007` by default.


Discussion / hints:
Hello can I solve this issue @kessler-frost . 
Hi @scarycool11 ! Yeah sure, please feel free to open a PR once you want us to take a look at your change.

Fix patch:
diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 000000000..9f656de98
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,38 @@
+# Copyright 2021 Agnostiq Inc.
+#
+# This file is part of Covalent.
+#
+# Licensed under the GNU Affero General Public License 3.0 (the "License").
+# A copy of the License may be obtained with this software package or at
+#
+#      https://www.gnu.org/licenses/agpl-3.0.en.html
+#
+# Use of this file is prohibited except in compliance with the License. Any
+# modifications or derivative works of this file must retain this copyright
+# notice, and modified files must contain a notice indicating that they have
+# been altered from the originals.
+#
+# Covalent is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the License for more details.
+#
+# Relief from the License may be granted by purchasing a commercial license.
+
+.github
+.tox
+.pytest_cache
+.git
+__pycache__
+tests
+env
+venv
+docker-compose*
+*.rst
+docs
+supervisord.*
+*err.log
+*out.log
+CHANGELOG*
+CODE_OF_CONDUCT*
+CONTRIBUTING*
+Dockerfile
diff --git a/.env.compose b/.env.compose
new file mode 100644
index 000000000..dfe3d089c
--- /dev/null
+++ b/.env.compose
@@ -0,0 +1,7 @@
+DATA_REPO=348041629502.dkr.ecr.us-east-1.amazonaws.com/covalent-data-dev
+DISPATCHER_REPO=348041629502.dkr.ecr.us-east-1.amazonaws.com/covalent-dispatcher-dev
+QUEUER_REPO=348041629502.dkr.ecr.us-east-1.amazonaws.com/covalent-queuer-dev
+QUEUE_CONSUMER_REPO=348041629502.dkr.ecr.us-east-1.amazonaws.com/covalent-queue-consumer-dev
+RESULTS_REPO=348041629502.dkr.ecr.us-east-1.amazonaws.com/covalent-results-dev
+RUNNER_REPO=348041629502.dkr.ecr.us-east-1.amazonaws.com/covalent-runner-dev
+UI_REPO=348041629502.dkr.ecr.us-east-1.amazonaws.com/covalent-ui-dev
diff --git a/.github/workflows/push_to_ecr.yml b/.github/workflows/push_to_ecr.yml
new file mode 100644
index 000000000..7e23e2344
--- /dev/null
+++ b/.github/workflows/push_to_ecr.yml
@@ -0,0 +1,63 @@
+# Copyright 2021 Agnostiq Inc.
+#
+# This file is part of Covalent.
+#
+# Licensed under the GNU Affero General Public License 3.0 (the "License").
+# A copy of the License may be obtained with this software package or at
+#
+#      https://www.gnu.org/licenses/agpl-3.0.en.html
+#
+# Use of this file is prohibited except in compliance with the License. Any
+# modifications or derivative works of this file must retain this copyright
+# notice, and modified files must contain a notice indicating that they have
+# been altered from the originals.
+#
+# Covalent is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the License for more details.
+#
+# Relief from the License may be granted by purchasing a commercial license.
+
+name: push-to-ecr
+
+on:
+    push:
+        branches:
+            - develop
+
+jobs:
+    push_to_ecr:
+        runs-on: ubuntu-latest
+        steps:
+            - name: Check out head
+              uses: actions/checkout@v2
+            - name: Configure AWS credentials
+              uses: aws-actions/configure-aws-credentials@v1
+              with:
+                  aws-access-key-id: ${{ secrets.AWS_KEY_ID }}
+                  aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
+                  aws-region: us-east-1
+            - name: Login to ECR
+              uses: aws-actions/amazon-ecr-login@v1
+            - name: Push to ECR
+              run: |
+                docker-compose -f docker-compose.dev.yml up --build -d
+                echo 'Displaying containers...'
+                docker ps
+                source .env.compose
+                docker tag covalent-data:latest $DATA_REPO
+                docker tag covalent-dispatcher:latest $DISPATCHER_REPO
+                docker tag covalent-queuer:latest $QUEUER_REPO
+                docker tag covalent-queue-consumer:latest $QUEUE_CONSUMER_REPO
+                docker tag covalent-results:latest $RESULTS_REPO
+                docker tag covalent-runner:latest $RUNNER_REPO
+                docker tag covalent-ui:latest $UI_REPO
+                docker push $DATA_REPO
+                docker push $DISPATCHER_REPO
+                docker push $QUEUER_REPO
+                docker push $QUEUE_CONSUMER_REPO
+                docker push $RESULTS_REPO
+                docker push $RUNNER_REPO
+                docker push $UI_REPO
+
+          
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6b4ca3c39..097491d0d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 ## [UNRELEASED]
 
+### Added
+
+- Added docker-compose file to run covalent microservices.
+
 ## [0.52.0] - 2022-04-04
 
 ### Added
diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml
new file mode 100644
index 000000000..93915bb8e
--- /dev/null
+++ b/docker-compose.dev.yml
@@ -0,0 +1,93 @@
+# This file should be used for local development
+# Example Usage: Run "docker-compose -f docker-compose.dev.yml up --build" from the root of the project
+# to build the images using this file and start the containers.
+
+version: "3.9"
+
+services:
+  covalent-data:
+    build:
+      context: .
+      dockerfile: refactor/data/Dockerfile
+    image: covalent-data
+    command: sh -c "python main.py"
+    ports:
+      - "8004:8004"
+    working_dir: /data
+    networks:
+     covalent:
+
+  covalent-dispatcher:
+    build:
+      context: .
+      dockerfile: refactor/dispatcher/Dockerfile
+    image: covalent-dispatcher
+    command: sh -c "python main.py"
+    ports:
+      - "8002:8002"
+    working_dir: /dispatcher
+    networks:
+     covalent:
+
+  covalent-queuer:
+    build:
+      context: .
+      dockerfile: refactor/queuer/Dockerfile
+    image: covalent-queuer
+    command: sh -c "python main.py"
+    ports:
+      - "8001:8001"
+    working_dir: /queuer
+    networks:
+      covalent:
+
+  # Queue-consumer uses the same Dockerfile configurations as the Queuer
+  covalent-queue-consumer:
+    build:
+      context: .
+      dockerfile: refactor/queuer/Dockerfile
+    image: covalent-queue-consumer
+    command: sh -c "python main.py"
+    ports:
+      - "3000:8001"
+    working_dir: /queuer
+    networks:
+      covalent:
+
+  covalent-results:
+    build:
+      context: .
+      dockerfile: refactor/results/Dockerfile
+    image: covalent-results
+    command: sh -c "python main.py"
+    ports:
+      - "8006:8006"
+    working_dir: /results
+    networks:
+     covalent:
+
+  covalent-runner:
+    build:
+      context: .
+      dockerfile: refactor/runner/Dockerfile
+    image: covalent-runner
+    command: sh -c "python main.py"
+    ports:
+      - "8003:8003"
+    working_dir: /runner
+    networks:
+      covalent:
+
+  covalent-ui:
+    build:
+      context: .
+      dockerfile: refactor/ui_backend/Dockerfile
+    image: covalent-ui
+    command: sh -c "python main.py"
+    ports:
+      - "8005:8005"
+    working_dir: /ui_backend
+    networks:
+      covalent:
+networks:
+  covalent:
\ No newline at end of file
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 000000000..7b2962767
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,72 @@
+# This file is used for Covalent cloud deployment workflows with ECR
+# Example usage: Run "docker-compose --env-file .env.compose up" from the root of the project
+# to pull the images from ECR and start the containers.
+
+version: "3.9"
+
+services:
+  covalent-data:
+    image: "${DATA_REPO}"
+    command: sh -c "python main.py"
+    ports:
+      - "8004:8004"
+    working_dir: /data
+    networks:
+     covalent:
+
+  covalent-dispatcher:
+    image: "${DISPATCHER_REPO}"
+    command: sh -c "python main.py"
+    ports:
+      - "8002:8002"
+    working_dir: /dispatcher
+    networks:
+     covalent:
+
+  covalent-queuer:
+    image: "${QUEUER_REPO}"
+    command: sh -c "python main.py"
+    ports:
+      - "8001:8001"
+    working_dir: /queuer
+    networks:
+      covalent:
+
+  # Queue-consumer uses the same Dockerfile configurations as the Queuer
+  covalent-queue-consumer:
+    image: "${QUEUE_CONSUMER_REPO}"
+    command: sh -c "python main.py"
+    ports:
+      - "5000:8000"
+    working_dir: /queuer
+    networks:
+      covalent:
+
+  covalent-results:
+    image: "${RESULTS_REPO}"
+    command: sh -c "python main.py"
+    ports:
+      - "8006:8006"
+    working_dir: /results
+    networks:
+     covalent:
+
+  covalent-runner:
+    image: "${RUNNER_REPO}"
+    command: sh -c "python main.py"
+    ports:
+      - "8003:8003"
+    working_dir: /runner
+    networks:
+      covalent:
+
+  covalent-ui:
+    image: "${UI_REPO}"
+    command: sh -c "python main.py"
+    ports:
+      - "8005:8005"
+    working_dir: /ui_backend
+    networks:
+      covalent:
+networks:
+  covalent:
diff --git a/refactor/data/Dockerfile b/refactor/data/Dockerfile
index 76bb12249..ac8a6a9f7 100644
--- a/refactor/data/Dockerfile
+++ b/refactor/data/Dockerfile
@@ -20,21 +20,16 @@
 
 # syntax=docker/dockerfile:1
 FROM python:3.8-slim-buster
+ENV PROJECT_DIR=/data
+ENV PORT 8003
+EXPOSE $PORT
 
-ENV PROJECT_DIR=/data_svc
-ENV REQ_DIR=/requirements
-
-RUN mkdir $PROJECT_DIR $REQ_DIR
-RUN chmod 0777 $PROJECT_DIR $REQ_DIR
+RUN mkdir $PROJECT_DIR \
+    && chmod 0777 $PROJECT_DIR
 
 WORKDIR $PROJECT_DIR
 
-COPY requirements $REQ_DIR
-RUN pip install  --no-cache-dir --upgrade -r $REQ_DIR/dist.txt
-
-COPY . .
-
-ENV PORT 8003
-EXPOSE $PORT
+COPY refactor/data/ $PROJECT_DIR
+RUN pip3 install  --no-cache-dir --upgrade -r $PROJECT_DIR/requirements/dist.txt
 
 CMD [ "python", "main.py"]
diff --git a/refactor/dispatcher/Dockerfile b/refactor/dispatcher/Dockerfile
index 61d032570..a903c873f 100644
--- a/refactor/dispatcher/Dockerfile
+++ b/refactor/dispatcher/Dockerfile
@@ -20,21 +20,30 @@
 
 # syntax=docker/dockerfile:1
 FROM python:3.8-slim-buster
-
 ENV PROJECT_DIR=/dispatcher
-ENV REQ_DIR=/requirements
+ENV COVALENT_ROOT=/covalent
+ENV PORT 8001
+EXPOSE $PORT
 
-RUN mkdir $PROJECT_DIR $REQ_DIR
-RUN chmod 0777 $PROJECT_DIR $REQ_DIR
+RUN apt-get update \
+  && apt-get install -y --no-install-recommends git gcc g++ make \
+  && cd /usr/local/bin \
+  && pip3 install --upgrade pip \
+  && rm -rf /var/lib/apt/lists/*
 
-WORKDIR $PROJECT_DIR
 
-COPY requirements $REQ_DIR
-RUN pip install  --no-cache-dir --upgrade -r $REQ_DIR/dist.txt
+RUN mkdir -p $PROJECT_DIR $COVALENT_ROOT/{covalent,covalent_dispatcher,covalent_ui}
+RUN chmod 0777 $PROJECT_DIR  && cd $PROJECT_DIR \
+    && mkdir webapp && cd webapp \
+    && mkdir build
 
-COPY . .
+COPY covalent/ $COVALENT_ROOT/covalent
+COPY covalent_dispatcher/ $COVALENT_ROOT/covalent_dispatcher
+COPY covalent_ui/ $COVALENT_ROOT/covalent_ui
+COPY ["setup.py", "requirements.txt", "VERSION", "README.md", "$COVALENT_ROOT/"]
+RUN pip3 install $COVALENT_ROOT
 
-ENV PORT 8001
-EXPOSE $PORT
+COPY refactor/dispatcher/ $PROJECT_DIR
 
+WORKDIR $PROJECT_DIR
 CMD [ "python", "main.py"]
diff --git a/refactor/dispatcher/requirements/dist.txt b/refactor/dispatcher/requirements/dist.txt
index 264490eb2..b9c8cf8e8 100644
--- a/refactor/dispatcher/requirements/dist.txt
+++ b/refactor/dispatcher/requirements/dist.txt
@@ -1,6 +1,18 @@
 cloudpickle==2.0.0
+dask[distributed]==2022.1.0
 fastapi==0.74.0
 fastapi-socketio==0.0.9
-requests==2.24.0
+flask==2.0.1
+flask-cors==3.0.10
+flask-socketio==5.1.1
+matplotlib==3.5.1
+networkx==2.5
 pydantic==1.9.0
-python-dotenv==0.19.2
\ No newline at end of file
+python-dotenv==0.19.2
+python-multipart==0.0.5
+PyYAML==6.0
+requests==2.24.0
+simplejson==3.17.6
+tailer==0.4.1
+toml==0.10.2
+uvicorn==0.15.0
\ No newline at end of file
diff --git a/refactor/queuer/Dockerfile b/refactor/queuer/Dockerfile
index e15682da1..6bd86b290 100644
--- a/refactor/queuer/Dockerfile
+++ b/refactor/queuer/Dockerfile
@@ -20,21 +20,15 @@
 
 # syntax=docker/dockerfile:1
 FROM python:3.8-slim-buster
-
 ENV PROJECT_DIR=/queuer
-ENV REQ_DIR=/requirements
-
-RUN mkdir $PROJECT_DIR $REQ_DIR
-RUN chmod 0777 $PROJECT_DIR $REQ_DIR
-
-WORKDIR $PROJECT_DIR
-
-COPY requirements $REQ_DIR
-RUN pip install  --no-cache-dir --upgrade -r $REQ_DIR/dist.txt
-
-COPY . .
-
 ENV PORT 8000
 EXPOSE $PORT
 
+RUN mkdir $PROJECT_DIR
+RUN chmod 0777 $PROJECT_DIR
+
+COPY refactor/queuer/ $PROJECT_DIR
+RUN pip3 install  --no-cache-dir --upgrade -r $PROJECT_DIR/requirements/dist.txt
+
+WORKDIR $PROJECT_DIR
 CMD [ "python", "main.py"]
diff --git a/refactor/queuer/requirements/dist.txt b/refactor/queuer/requirements/dist.txt
index 2249b854f..0345ab050 100644
--- a/refactor/queuer/requirements/dist.txt
+++ b/refactor/queuer/requirements/dist.txt
@@ -1,10 +1,11 @@
-uvicorn==0.15.0
-python-dotenv==0.19.2
-pydantic==1.9.0
+aiolimiter==1.0.0
+cloudpickle==2.0.0
 fastapi==0.74.0
+fastapi-socketio==0.0.9
 nats-py==2.0.0
+pydantic==1.9.0
+python-dotenv==0.19.2
 python-multipart==0.0.5
-aiolimiter==1.0.0
-fastapi-socketio==0.0.9
 websockets==10.2
-requests==2.24.0
\ No newline at end of file
+requests==2.24.0
+uvicorn==0.15.0
\ No newline at end of file
diff --git a/refactor/results/Dockerfile b/refactor/results/Dockerfile
new file mode 100644
index 000000000..08f37772d
--- /dev/null
+++ b/refactor/results/Dockerfile
@@ -0,0 +1,39 @@
+# Copyright 2021 Agnostiq Inc.
+#
+# This file is part of Covalent.
+#
+# Licensed under the GNU Affero General Public License 3.0 (the "License").
+# A copy of the License may be obtained with this software package or at
+#
+#      https://www.gnu.org/licenses/agpl-3.0.en.html
+#
+# Use of this file is prohibited except in compliance with the License. Any
+# modifications or derivative works of this file must retain this copyright
+# notice, and modified files must contain a notice indicating that they have
+# been altered from the originals.
+#
+# Covalent is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the License for more details.
+#
+# Relief from the License may be granted by purchasing a commercial license.
+
+# syntax=docker/dockerfile:1
+FROM python:3.8-slim-buster
+ENV PROJECT_DIR=/results
+ENV PORT 8006
+EXPOSE $PORT
+
+RUN mkdir -p $PROJECT_DIR $COVALENT_ROOT/{covalent,covalent_dispatcher,covalent_ui}
+RUN chmod 0777 $PROJECT_DIR
+
+COPY refactor/results $PROJECT_DIR
+COPY covalent/ $COVALENT_ROOT/covalent
+COPY covalent_dispatcher/ $COVALENT_ROOT/covalent_dispatcher
+COPY covalent_ui/ $COVALENT_ROOT/covalent_ui
+COPY ["setup.py", "VERSION", "README.md", "$COVALENT_ROOT/"]
+
+RUN pip3 install  --no-cache-dir --upgrade -r $PROJECT_DIR/requirements/dist.txt
+
+WORKDIR $PROJECT_DIR
+CMD [ "python", "main.py"]
diff --git a/refactor/results/requirements/dev.txt b/refactor/results/requirements/dev.txt
new file mode 100644
index 000000000..ef429dfc9
--- /dev/null
+++ b/refactor/results/requirements/dev.txt
@@ -0,0 +1,4 @@
+-r dist.txt
+mock==4.0.3
+pytest==7.1.1
+ipdb==0.13.9
\ No newline at end of file
diff --git a/refactor/results/requirements/dist.txt b/refactor/results/requirements/dist.txt
new file mode 100644
index 000000000..0345ab050
--- /dev/null
+++ b/refactor/results/requirements/dist.txt
@@ -0,0 +1,11 @@
+aiolimiter==1.0.0
+cloudpickle==2.0.0
+fastapi==0.74.0
+fastapi-socketio==0.0.9
+nats-py==2.0.0
+pydantic==1.9.0
+python-dotenv==0.19.2
+python-multipart==0.0.5
+websockets==10.2
+requests==2.24.0
+uvicorn==0.15.0
\ No newline at end of file
diff --git a/refactor/runner/Dockerfile b/refactor/runner/Dockerfile
index 29e5406fd..99d2e1c7d 100644
--- a/refactor/runner/Dockerfile
+++ b/refactor/runner/Dockerfile
@@ -20,21 +20,27 @@
 
 # syntax=docker/dockerfile:1
 FROM python:3.8-slim-buster
-
 ENV PROJECT_DIR=/runner
-ENV REQ_DIR=/requirements
-
-RUN mkdir $PROJECT_DIR $REQ_DIR
-RUN chmod 0777 $PROJECT_DIR $REQ_DIR
-
-WORKDIR $PROJECT_DIR
+ENV COVALENT_ROOT=/covalent
+ENV PORT 8002
+EXPOSE $PORT
 
-COPY requirements $REQ_DIR
-RUN pip install  --no-cache-dir --upgrade -r $REQ_DIR/dist.txt
+RUN apt-get update \
+  && apt-get install -y --no-install-recommends git gcc g++ make \
+  && cd /usr/local/bin \
+  && pip3 install --upgrade pip \
+  && rm -rf /var/lib/apt/lists/*
 
-COPY . .
+RUN mkdir $PROJECT_DIR
+RUN chmod 0777 $PROJECT_DIR
 
-ENV PORT 8002
-EXPOSE $PORT
+COPY covalent/ $COVALENT_ROOT/covalent
+COPY covalent_dispatcher/ $COVALENT_ROOT/covalent_dispatcher
+COPY covalent_ui/ $COVALENT_ROOT/covalent_ui
+COPY ["setup.py", "requirements.txt", "VERSION", "README.md", "$COVALENT_ROOT/"]
+RUN pip3 install $COVALENT_ROOT
 
+COPY refactor/runner $PROJECT_DIR
+WORKDIR $PROJECT_DIR
 CMD [ "python", "main.py"]
+
diff --git a/refactor/runner/requirements/dist.txt b/refactor/runner/requirements/dist.txt
index a83bb213a..66ca88bfd 100644
--- a/refactor/runner/requirements/dist.txt
+++ b/refactor/runner/requirements/dist.txt
@@ -1,6 +1,17 @@
 cloudpickle==2.0.0
+dask[distributed]==2022.1.0
 fastapi==0.74.0
 fastapi-socketio==0.0.9
+flask==2.0.1
+flask-cors==3.0.10
+flask-socketio==5.1.1
+matplotlib==3.5.1
+networkx==2.5
 pydantic==1.9.0
+python-multipart==0.0.5
+PyYAML==6.0
 requests==2.24.0
+simplejson==3.17.6
+tailer==0.4.1
+toml==0.10.2
 uvicorn==0.15.0
\ No newline at end of file
diff --git a/refactor/ui_backend/Dockerfile b/refactor/ui_backend/Dockerfile
index 5db419543..05255c225 100644
--- a/refactor/ui_backend/Dockerfile
+++ b/refactor/ui_backend/Dockerfile
@@ -20,21 +20,30 @@
 
 # syntax=docker/dockerfile:1
 FROM python:3.8-slim-buster
+ENV PROJECT_DIR=/ui_backend
+ENV COVALENT_ROOT=/covalent
+ENV PORT 8005
+EXPOSE $PORT
 
-ENV PROJECT_DIR=/covalent_ui
-ENV REQ_DIR=/requirements
+RUN apt-get update \
+  && apt-get install -y --no-install-recommends git gcc g++ make \
+  && cd /usr/local/bin \
+  && pip3 install --upgrade pip \
+  && rm -rf /var/lib/apt/lists/*
 
-RUN mkdir $PROJECT_DIR $REQ_DIR
-RUN chmod 0777 $PROJECT_DIR $REQ_DIR
 
-WORKDIR $PROJECT_DIR
+RUN mkdir -p $PROJECT_DIR $COVALENT_ROOT/{covalent,covalent_dispatcher,covalent_ui}
+RUN chmod 0777 $PROJECT_DIR  && cd $PROJECT_DIR \
+    && mkdir webapp && cd webapp \
+    && mkdir build
 
-COPY requirements $REQ_DIR
-RUN pip install  --no-cache-dir --upgrade -r $REQ_DIR/dist.txt
+COPY covalent/ $COVALENT_ROOT/covalent
+COPY covalent_dispatcher/ $COVALENT_ROOT/covalent_dispatcher
+COPY covalent_ui/ $COVALENT_ROOT/covalent_ui
+COPY ["setup.py", "requirements.txt", "VERSION", "README.md", "$COVALENT_ROOT/"]
+RUN pip3 install $COVALENT_ROOT
 
-COPY . .
-
-ENV PORT 8004
-EXPOSE $PORT
+COPY refactor/ui_backend/ $PROJECT_DIR
 
+WORKDIR $PROJECT_DIR
 CMD [ "python", "main.py"]
diff --git a/refactor/ui_backend/requirements/dist.txt b/refactor/ui_backend/requirements/dist.txt
index 5c4210591..486ca0cd0 100644
--- a/refactor/ui_backend/requirements/dist.txt
+++ b/refactor/ui_backend/requirements/dist.txt
@@ -1,7 +1,18 @@
 aiolimiter==1.0.0
 cloudpickle==2.0.0
+dask[distributed]==2022.1.0
 fastapi==0.74.0
 fastapi-socketio==0.0.9
+flask==2.0.1
+flask-cors==3.0.10
+flask-socketio==5.1.1
+matplotlib==3.5.1
+networkx==2.5
+python-dotenv==0.19.2
+python-multipart==0.0.5
 pydantic==1.9.0
 requests==2.24.0
+simplejson==3.17.6
+tailer==0.4.1
+toml==0.10.2
 uvicorn==0.15.0
\ No newline at end of file
diff --git a/setup.py b/setup.py
index 29ac81faf..6820297bf 100644
--- a/setup.py
+++ b/setup.py
@@ -166,7 +166,7 @@ def run(self):
     "package_data": {
         "covalent": [
             "executor/executor_plugins/local.py",
-            "notify/notification_plugins/notify.py",
+            "notify/notification_plugins/webhook.py",
         ],
         "covalent_dispatcher": ["_service/app.py"],
         "covalent_ui": recursively_append_files("covalent_ui/webapp/build"),


Test patch:
diff --git a/.github/workflows/test_images.yml b/.github/workflows/test_images.yml
new file mode 100644
index 000000000..15410dcbb
--- /dev/null
+++ b/.github/workflows/test_images.yml
@@ -0,0 +1,41 @@
+# Copyright 2021 Agnostiq Inc.
+#
+# This file is part of Covalent.
+#
+# Licensed under the GNU Affero General Public License 3.0 (the "License").
+# A copy of the License may be obtained with this software package or at
+#
+#      https://www.gnu.org/licenses/agpl-3.0.en.html
+#
+# Use of this file is prohibited except in compliance with the License. Any
+# modifications or derivative works of this file must retain this copyright
+# notice, and modified files must contain a notice indicating that they have
+# been altered from the originals.
+#
+# Covalent is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the License for more details.
+#
+# Relief from the License may be granted by purchasing a commercial license.
+
+name: test-images
+
+on:
+  pull_request
+
+jobs:
+  test_images:
+    runs-on: ubuntu-latest
+    steps:
+      - name: Check out head
+        uses: actions/checkout@v2
+      - name: Build and run images
+        run: |
+          docker-compose -f docker-compose.dev.yml up --build -d
+          echo 'Displaying containers...'
+      - name: Test Containers
+          run: |
+            # commands for testing container networking will go here
+          
+
+