Docker&docker-compose在Mac&ubuntu20上部署odoo14项目

目录

  1. Docker & docker-compose 安装
  2. 项目结构说明
  3. 项目搭建流程
  4. ubuntu20 odoo14 项目部署

Docker & docker-compose 安装

Mac Docker 安装,这里是手动通过安装包安装,请点击以下链接下载 Install Docker Desktop on Mac。 具体安装流程不讲。

Ubuntu20.04 Docker & docker-compose安装 ,流程我就不写了 ,详细可以参考这篇文章,写的很详细:Ubuntu20.04 LTS国内源安装指定版本Docker/docker-compose

项目结构说明

Docker&docker-compose在Mac&ubuntu20上部署odoo14项目_第1张图片

结构&作用说明:
conf:这个是存放配置文件的文件夹,与容器/etc/odoo/目录进行挂载。可实现修改conf内配置文件,即可同步到项目容器中。
data: 与项目容器中/var/lib/odoo目录挂载 。用于存储odoo中的资料,本地实时同步。
myaddons:这个文件夹用于存放自定义的应用模块。
odoo:这个是odoo指定版本的源码,源码将用于挂载到项目容器中/usr/lib/python3/dist-packages/odoo目录的源码 。如果你项目的源码没有修改的话 ,可以不挂载。
postgresData:这个文件夹用于同步项目数据,数据库挂载。将项目数据库做本地备份。如果数据库挂掉 ,可快速恢复。
docker-compose.yml:这个是项目的启动项配置文件。
Dockerfile:官方的odoo 镜像文件,用来生成odoo镜像,entrypoint.shwait-for-psql.py这几个文件是生成镜像时需要调用的脚本文件。可以在这下载Dokcer-odoo
odoo.conf ``:项目的配置文件requirements.txt```:这个是项目的第三方库。

项目搭建流程

自定义odoo镜像

我这里用的是odoo14版本。因为项目生产环境的部署,肯定是带有自定义应用模块的,所以不能避免需要安装第三方库。所以我们在做镜像的时候 ,先把odoo中所用到的第三方库加入到Dockerfile镜像文件中。这是在官方镜像文件的基础上,增加一些基础包为了避免安装第三方库报错,和安装第三方库后的镜像文件。

FROM debian:buster-slim
MAINTAINER Odoo S.A. >

SHELL ["/bin/bash", "-xo", "pipefail", "-c"]

# Generate locale C.UTF-8 for postgres and general locale data
ENV LANG C.UTF-8

# Install some deps, lessc and less-plugin-clean-css, and wkhtmltopdf
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
        ca-certificates \
        curl \
        dirmngr \
        fonts-noto-cjk \
        gnupg \
        libssl-dev \
        node-less \
        npm \
        python3-num2words \
        python3-pdfminer \
        python3-pip \
        python3-phonenumbers \
        python3-pyldap \
        python3-qrcode \
        python3-renderpm \
        python3-setuptools \
        python3-slugify \
        python3-vobject \
        python3-watchdog \
        python3-xlrd \
        python3-xlwt \
        xz-utils \
        tofrodos \
        build-essential \
        python3-dev \
        libffi-dev \
        libxml2 \
        libxml2-dev \
        libxslt1-dev \
        zlib1g-dev \
        libsasl2-dev \
        libldap2-dev \
    && curl -o wkhtmltox.deb -sSL https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.5/wkhtmltox_0.12.5-1.buster_amd64.deb \
    && echo 'ea8277df4297afc507c61122f3c349af142f31e5 wkhtmltox.deb' | sha1sum -c - \
    && apt-get install -y --no-install-recommends ./wkhtmltox.deb \
    && rm -rf /var/lib/apt/lists/* wkhtmltox.deb

# install latest postgresql-client
RUN echo 'deb http://apt.postgresql.org/pub/repos/apt/ buster-pgdg main' > /etc/apt/sources.list.d/pgdg.list \
    && GNUPGHOME="$(mktemp -d)" \
    && export GNUPGHOME \
    && repokey='B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8' \
    && gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "${repokey}" \
    && gpg --batch --armor --export "${repokey}" > /etc/apt/trusted.gpg.d/pgdg.gpg.asc \
    && gpgconf --kill all \
    && rm -rf "$GNUPGHOME" \
    && apt-get update  \
    && apt-get install --no-install-recommends -y postgresql-client \
    && rm -f /etc/apt/sources.list.d/pgdg.list \
    && rm -rf /var/lib/apt/lists/*

# Install rtlcss (on Debian buster)
RUN npm install -g rtlcss

# Install Odoo
ENV ODOO_VERSION 14.0
ARG ODOO_RELEASE=20210809
ARG ODOO_SHA=d9d18498eab946032cacd23d9e8ae69bfbce046b
RUN curl -o odoo.deb -sSL http://nightly.odoo.com/${ODOO_VERSION}/nightly/deb/odoo_${ODOO_VERSION}.${ODOO_RELEASE}_all.deb \
    && echo "${ODOO_SHA} odoo.deb" | sha1sum -c - \
    && apt-get update \
    && apt-get -y install --no-install-recommends ./odoo.deb \
    && rm -rf /var/lib/apt/lists/* odoo.deb

# Copy entrypoint script and Odoo configuration file
COPY ./entrypoint.sh /
COPY ./odoo.conf /etc/odoo/
COPY ./requirements.txt /etc/odoo/
# 在镜像中安装第三方依赖依赖
RUN pip3 install --upgrade pip
RUN pip3 install wheel
RUN fromdos /etc/odoo/requirements.txt
RUN pip3 install  -r /etc/odoo/requirements.txt --ignore-installed

# Set permissions and Mount /var/lib/odoo to allow restoring filestore and /mnt/extra-addons for users addons
RUN chown odoo /etc/odoo/odoo.conf \
    && mkdir -p /mnt/extra-addons \
    && chown -R odoo /mnt/extra-addons
VOLUME ["/var/lib/odoo", "/mnt/extra-addons"]

# Expose Odoo services
EXPOSE 8069 8071 8072

# Set the default config file
ENV ODOO_RC /etc/odoo/odoo.conf

COPY wait-for-psql.py /usr/local/bin/wait-for-psql.py

# Set default user when running the container
USER odoo

ENTRYPOINT ["/entrypoint.sh"]
CMD ["odoo"]

修改处说明:
1、系统基本环境里增加以下的模块,具体模块的作用是为了解决在使用pip3安装第三方库的时候报错。
[xz-utils \ tofrodos \ build-essential \ python3-dev \libffi-dev \ libxml2 \ libxml2-dev \ libxslt1-dev \ zlib1g-dev \ libsasl2-dev ]

2、将第三方库文件上传到镜像容器,并转译 ,有的时候从window&mac系统上传的文件,编码容易被转化,所以将文件做一遍编码转译。

COPY ./requirements.txt /etc/odoo/
# 在镜像中安装第三方依赖依赖
RUN pip3 install --upgrade pip
RUN pip3 install wheel
RUN fromdos /etc/odoo/requirements.txt
RUN pip3 install  -r /etc/odoo/requirements.txt --ignore-installed
项目启动文件docker-compose.yml编写

docker-compose.yml启动项文件,文件主要负责搭建项目环境,让项目快速启动。文件结构就不一一解释了 。可以根据自己的需求去改

version: '3'
services:
  web:
  # 选择容器基础镜像,这里我们选择通过build . 意思就是拉取当前目录下的Dockerfile文件构建镜像。也可以使用 image: odoo:14 获取官方镜像,或者你自己的私有镜像。
#   image: odoo:14
    build: .
    # 自定义容器名
    container_name: myodoo14
    # 项目依赖于 db , 所以启动时,会先创建db容器
    depends_on:
      - db
    # 端口映射 : 服务器端口:容器端口
    ports:
      - "8069:8069"
    # 容器所属网络,根据需求可以自定义。
    networks:
      - "yourNet"
    # 设置容器挂载,结合项目结构,一看就懂
    volumes:
      # 配置文件挂载
      - ./conf:/etc/odoo
      - ./data:/var/lib/odoo
      - ./myaddons:/mnt/extra-myaddons
      # 源码挂载替换
      - ./odoo:/usr/lib/python3/dist-packages/odoo
    # 项目挂了后,会自动重启
    restart: always
# 数据库容器。
  db:
    image: postgres:10
    container_name: pgsql_potier
    ports:
      - "5432:5432"
    networks:
      - "yourNet"
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_PASSWORD=odoo
      - POSTGRES_USER=odoo
      - PGDATA=/var/lib/postgresql/data/pgdata
    volumes:
    # 将数据库数据挂载到本地
      - ./postgresData:/var/lib/postgresql/data/pgdata
    restart: always
networks:
  yourNet:
  	# 桥接模式
    driver: bridge

启动项文件配置完成 。

Ubuntu20.04 项目部署

# 服务器安装unzip 
sudo apt install unzip
# 解压项目包
unzip hzcenter.zip
# 进入项目根目录
cd hzcenter
# 启动项目,要在项目根目录下执行
docker-compose up 

到这里,项目已经部署完了 。可以通过浏览器去访问项目了 。如果没报错的话 ,那就搞定了 。不过一般是会报错的,主要是权限的问题 。需要重新设置一下。诶嘿嘿~

项目部署后权限处理

项目部署成功后 ,一般会有两个权限问题 。我们一个一个解释。

1、项目在通过Dockerfile构建镜像的时候 ,有赋予镜像容器内/etc/odoo/odoo.conf文件的权限 ,但是在启动项中,又再次挂载一次后 ,需要重新赋予权限。因为挂载后会覆盖掉之前的权限。所以,我们这里在部署后要再次赋予权限。

报错信息

# 在容器运行的情况下
docker ps -a
docker exec -u root 你的项目容器id&或者容器名 chown odoo:odoo -R /etc/odoo

权限赋予完成后 ,重启项目:docker-compose down && docker-compose up
查看日志, 你会发现,没有报Permission denied错误了。但是,通过浏览器去访问项目 ,还是没有反应,而且项目日志也没有变化 。那么我们看到第二点。

2、 同样 ,还是挂载的问题 ,本地环境里面的 挂载目录data的权限也需要更新,否则,odoo 项目在访问时候的资料无法写入data目录中,导致项目无法被访问 。会报错curl (52) empty reply from server
2.1、另外当迁移项目时 。需要删除data文件夹。重新挂载卷。

解决方法:在项目根目录下, 赋予data权限:sudo chmod -R 777 ./data

这个时候 ,重启一下项目容器 ,就可以通过浏览器访问成功了 。

后续问题-更新

关于docker-compose挂载权限的问题,我们在部署项目时, 在Dockerfile文件中有进行一次匿名挂载。后面,在docker-compse.yml文件中添加和覆盖了部分挂载。此时如果将第三方模块放到挂载的目录下 ,会导致项目访问应用界面白屏 。请求不到东西 。

原因: 通过docker-compose.yml进行挂载的目录都是以root
用户进行挂载的 。但是我们的项目都是以odoo的用户运行的 。此时挂载的目录odoo是没有权限的 。那么如何解决呢 。肯定是赋予权限啊 。

如果项目已经在运行了,就像我们这种情况,白屏啦 。那么直接通过docker进入容器并赋予权限即可:(以root的身份进入后台,并赋予odoo用户的权限,完成之后重启项目容器)

docker exec -u root myodoo14 chown odoo:odoo -R /mnt/extra-myaddons

docker restart myodoo14

还有一个办法:就是在配置docker-compose时通过command执行赋予权限的命令。不过我没试过。这种方法一劳永逸。推荐,以后试试

你可能感兴趣的:(odoo,python,ubuntu,docker,python,ubuntu)