From 69cc6243a74e1a5b3b5fcdad1956e900e61ca203 Mon Sep 17 00:00:00 2001 From: "apple.iiiyu@gmail.com" Date: Tue, 18 Jul 2023 20:00:34 +1200 Subject: [PATCH] Update Dockerfile for Apple silicon --- .gitignore | 1 + Dockerfile | 40 ++++++++++++++-------------------------- README.md | 16 ++++++++-------- metagpt/utils/mermaid.py | 8 +++++++- puppeteer-config.json | 6 ++++++ 5 files changed, 36 insertions(+), 35 deletions(-) create mode 100644 puppeteer-config.json diff --git a/.gitignore b/.gitignore index 8b9b9e970..80d5e2a58 100644 --- a/.gitignore +++ b/.gitignore @@ -162,3 +162,4 @@ workspace/* *.mmd tmp output.wav +opt diff --git a/Dockerfile b/Dockerfile index 1a375d305..e5e29b985 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,48 +2,36 @@ # For users outside mainland China, feel free to modify or delete them :) # Use a base image with Python 3.9.17 slim version (Bullseye) -FROM python:3.9.17-slim-bullseye +FROM nikolaik/python-nodejs:python3.9-nodejs20-slim # Install Debian software needed by MetaGPT -RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list &&\ - apt update &&\ - apt install -y git curl wget build-essential gcc clang g++ make gnupg &&\ - curl -sL https://deb.nodesource.com/setup_19.x | bash - &&\ - apt install -y nodejs &&\ - wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - &&\ - sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' &&\ - apt-get update &&\ - apt-get install -y google-chrome-stable fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst fonts-freefont-ttf libxss1 --no-install-recommends &&\ - apt-get clean +RUN apt update &&\ + apt install -y git chromium fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst fonts-freefont-ttf libxss1 --no-install-recommends &&\ + apt clean # Set the working directory to /app WORKDIR /app -# Install Mermaid CLI globally and clone the MetaGPT repository -#ENV PUPPETEER_SKIP_DOWNLOAD='true' -RUN npm config set registry https://registry.npm.taobao.org &&\ - npm install -g @mermaid-js/mermaid-cli &&\ - npm cache clean --force &&\ - git clone https://github.com/geekan/metagpt +# Install Mermaid CLI globally +ENV CHROME_BIN="/usr/bin/chromium" +ENV AM_I_IN_A_DOCKER_CONTAINER Yes +ADD puppeteer-config.json /puppeteer-config.json +RUN npm install -g @mermaid-js/mermaid-cli &&\ + npm cache clean --force + +# Copy src to container the MetaGPT repository +COPY . /app/metagpt # Install Python dependencies and install MetaGPT RUN cd metagpt &&\ mkdir workspace &&\ - pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ &&\ pip install -r requirements.txt &&\ pip cache purge &&\ python setup.py install # Add metagpt user so we don't need --no-sandbox when use puppeteer RUN useradd -m metagpt -s /bin/bash &&\ - chown metagpt -R /app/metagpt &&\ - cp -r /root/.cache /home/metagpt/ &&\ - chown metagpt -R /home/metagpt/.cache &&\ - chrome_sandbox=$(find /root/.cache/puppeteer/chrome/ -name "chrome_sandbox") &&\ - cp $chrome_sandbox /usr/local/sbin/chrome-devel-sandbox &&\ - chmod 4755 /usr/local/sbin/chrome-devel-sandbox - -ENV CHROME_DEVEL_SANDBOX=/usr/local/sbin/chrome-devel-sandbox + chown metagpt -R /app/metagpt WORKDIR /app/metagpt USER metagpt diff --git a/README.md b/README.md index 8ade2339b..b9ba76281 100644 --- a/README.md +++ b/README.md @@ -55,23 +55,23 @@ ### Installation by Docker ```bash # Step 1: Download metagpt official image and prepare config.yaml docker pull metagpt/metagpt:v0.2 -mkdir -p /opt/metagpt/{config,workspace} && chmod 777 -R /opt/metagpt -docker run --rm metagpt/metagpt:v0.2 cat /app/metagpt/config/config.yaml > /opt/metagpt/config/config.yaml +mkdir -p ./opt/metagpt/{config,workspace} && chmod 777 -R ./opt/metagpt +docker run --rm metagpt/metagpt:v0.2 cat /app/metagpt/config/config.yaml > ./opt/metagpt/config/config.yaml vim /opt/metagpt/config/config.yaml # Change the config # Step 2: Run metagpt demo with container docker run --rm \ --privileged \ - -v /opt/metagpt/config:/app/metagpt/config \ - -v /opt/metagpt/workspace:/app/metagpt/workspace \ + -v ./opt/metagpt/config:/app/metagpt/config \ + -v ./opt/metagpt/workspace:/app/metagpt/workspace \ metagpt/metagpt:v0.2 \ python startup.py "Write a cli snake game" # You can also start a container and execute commands in it docker run --name metagpt -d \ --privileged \ - -v /opt/metagpt/config:/app/metagpt/config \ - -v /opt/metagpt/workspace:/app/metagpt/workspace \ + -v ./opt/metagpt/config:/app/metagpt/config \ + -v ./opt/metagpt/workspace:/app/metagpt/workspace \ metagpt/metagpt:v0.2 docker exec -it metagpt /bin/bash @@ -80,8 +80,8 @@ # You can also start a container and execute commands in it The command `docker run ...` do the following things: - Run in privileged mode to have permission to run the browser -- Map host directory `/opt/metagtp/config` to container directory `/app/metagpt/config` -- Map host directory `/opt/metagpt/workspace` to container directory `/app/metagpt/workspace` +- Map host directory `./opt/metagpt/config` to container directory `/app/metagpt/config` +- Map host directory `./opt/metagpt/workspace` to container directory `/app/metagpt/workspace` - Execute the demo command `python startup.py "Write a cli snake game"` ### Build image by yourself diff --git a/metagpt/utils/mermaid.py b/metagpt/utils/mermaid.py index 35aceb2b9..edb09ffc7 100644 --- a/metagpt/utils/mermaid.py +++ b/metagpt/utils/mermaid.py @@ -6,12 +6,15 @@ @File : mermaid.py """ import subprocess +import os from pathlib import Path from metagpt.const import PROJECT_ROOT from metagpt.logs import logger from metagpt.utils.common import check_cmd_exists +IS_DOCKER = os.environ.get('AM_I_IN_A_DOCKER_CONTAINER', False) + def mermaid_to_file(mermaid_code, output_file_without_suffix, width=2048, height=2048) -> int: """suffix: png/svg/pdf @@ -34,7 +37,10 @@ def mermaid_to_file(mermaid_code, output_file_without_suffix, width=2048, height output_file = f'{output_file_without_suffix}.{suffix}' # Call the `mmdc` command to convert the Mermaid code to a PNG logger.info(f"Generating {output_file}..") - subprocess.run(['mmdc', '-i', str(tmp), '-o', output_file, '-w', str(width), '-H', str(height)]) + if IS_DOCKER: + subprocess.run(['mmdc', '-p', '/puppeteer-config.json', '-i', str(tmp), '-o', output_file, '-w', str(width), '-H', str(height)]) + else: + subprocess.run(['mmdc', '-i', str(tmp), '-o', output_file, '-w', str(width), '-H', str(height)]) return 0 diff --git a/puppeteer-config.json b/puppeteer-config.json new file mode 100644 index 000000000..7b2851c29 --- /dev/null +++ b/puppeteer-config.json @@ -0,0 +1,6 @@ +{ + "executablePath": "/usr/bin/chromium", + "args": [ + "--no-sandbox" + ] +} \ No newline at end of file