From 1647970fb6719c6e79f944857af8910a96247aaa Mon Sep 17 00:00:00 2001 From: qiuqiua <819110812@qq.com> Date: Mon, 31 Jul 2023 16:24:37 +0800 Subject: [PATCH] Add trobleshooting notes for devcontainer (#687) --- .devcontainer/Dockerfile | 11 +++++++ .devcontainer/README.md | 37 +++++++++++++++++++++ .devcontainer/devcontainer.json | 53 ++++++++++++++++++++++++++++++ .devcontainer/noop.txt | 3 ++ .devcontainer/troubleshooting.png | Bin 0 -> 13963 bytes 5 files changed, 104 insertions(+) create mode 100644 .devcontainer/Dockerfile create mode 100644 .devcontainer/README.md create mode 100644 .devcontainer/devcontainer.json create mode 100644 .devcontainer/noop.txt create mode 100644 .devcontainer/troubleshooting.png diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 0000000000..351a829d4c --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,11 @@ +FROM mcr.microsoft.com/devcontainers/anaconda:0-3 + +# Copy environment.yml (if found) to a temp location so we update the environment. Also +# copy "noop.txt" so the COPY instruction does not fail if no environment.yml exists. +COPY environment.yml* .devcontainer/noop.txt /tmp/conda-tmp/ +RUN if [ -f "/tmp/conda-tmp/environment.yml" ]; then umask 0002 && /opt/conda/bin/conda env update -n base -f /tmp/conda-tmp/environment.yml; fi \ + && rm -rf /tmp/conda-tmp + +# [Optional] Uncomment this section to install additional OS packages. +# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ +# && apt-get -y install --no-install-recommends diff --git a/.devcontainer/README.md b/.devcontainer/README.md new file mode 100644 index 0000000000..fa989584f5 --- /dev/null +++ b/.devcontainer/README.md @@ -0,0 +1,37 @@ +# Devlopment with devcontainer +This project includes a devcontainer configuration that allows you to open the project in a container with a fully configured development environment. +Both frontend and backend environments are initialized when the container is started. +## GitHub Codespaces +[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/langgenius/dify) + +you can simply click the button above to open this project in GitHub Codespaces. + +For more info, check out the [GitHub documentation](https://docs.github.com/en/free-pro-team@latest/github/developing-online-with-codespaces/creating-a-codespace#creating-a-codespace). + + +## VS Code Dev Containers +[![Open in Dev Containers](https://img.shields.io/static/v1?label=Dev%20Containers&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/langgenius/dify) + +if you have VS Code installed, you can click the button above to open this project in VS Code Dev Containers. + +You can learn more in the [Dev Containers documentation](https://code.visualstudio.com/docs/devcontainers/containers). + + +## Pros of Devcontainer +Unified Development Environment: By using devcontainers, you can ensure that all developers are developing in the same environment, reducing the occurrence of "it works on my machine" type of issues. + +Quick Start: New developers can set up their development environment in a few simple steps, without spending a lot of time on environment configuration. + +Isolation: Devcontainers isolate your project from your host operating system, reducing the chance of OS updates or other application installations impacting the development environment. + +## Cons of Devcontainer +Learning Curve: For developers unfamiliar with Docker and VS Code, using devcontainers may be somewhat complex. + +Performance Impact: While usually minimal, programs running inside a devcontainer may be slightly slower than those running directly on the host. + +## Troubleshooting +if you see such error message when you open this project in codespaces: +![Alt text](troubleshooting.png) + +a simple workaround is change `/signin` endpoint into another one, then login with github account and close the tab, then change it back to `/signin` endpoint. Then all things will be fine. +The reason is `signin` endpoint is not allowed in codespaces, details can be found [here](https://github.com/orgs/community/discussions/5204) \ No newline at end of file diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000000..a132b493c9 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,53 @@ +// For format details, see https://aka.ms/devcontainer.json. For config options, see the +// README at: https://github.com/devcontainers/templates/tree/main/src/anaconda +{ + "name": "Anaconda (Python 3)", + "build": { + "context": "..", + "dockerfile": "Dockerfile" + }, + "features": { + "ghcr.io/dhoeric/features/act:1": {}, + "ghcr.io/devcontainers/features/node:1": { + "nodeGypDependencies": true, + "version": "lts" + }, + "ghcr.io/devcontainers-contrib/features/npm-package:1": { + "package": "typescript", + "version": "latest" + }, + "ghcr.io/devcontainers/features/docker-in-docker:2": { + "moby": true, + "azureDnsAutoDetection": true, + "installDockerBuildx": true, + "version": "latest", + "dockerDashComposeVersion": "v2" + } + }, + "customizations": { + "vscode": { + "extensions": [ + "ms-python.pylint", + "GitHub.copilot", + "ms-python.python" + ] + } + }, + "postStartCommand": "cd api && pip install -r requirements.txt", + "postCreateCommand": "cd web && npm install" + + // Features to add to the dev container. More info: https://containers.dev/features. + // "features": {}, + + // Use 'forwardPorts' to make a list of ports inside the container available locally. + // "forwardPorts": [], + + // Use 'postCreateCommand' to run commands after the container is created. + // "postCreateCommand": "python --version", + + // Configure tool-specific properties. + // "customizations": {}, + + // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. + // "remoteUser": "root" +} diff --git a/.devcontainer/noop.txt b/.devcontainer/noop.txt new file mode 100644 index 0000000000..dde8dc3c10 --- /dev/null +++ b/.devcontainer/noop.txt @@ -0,0 +1,3 @@ +This file copied into the container along with environment.yml* from the parent +folder. This file is included to prevents the Dockerfile COPY instruction from +failing if no environment.yml is found. \ No newline at end of file diff --git a/.devcontainer/troubleshooting.png b/.devcontainer/troubleshooting.png new file mode 100644 index 0000000000000000000000000000000000000000..61bd479d2f857148ad8de29b25ad351157bc5fe2 GIT binary patch literal 13963 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 literal 0 HcmV?d00001