Mac Docker 安装,这里是手动通过安装包安装,请点击以下链接下载 Install Docker Desktop on Mac。 具体安装流程不讲。
Ubuntu20.04 Docker & docker-compose安装 ,流程我就不写了 ,详细可以参考这篇文章,写的很详细:Ubuntu20.04 LTS国内源安装指定版本Docker/docker-compose
结构&作用说明:
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.sh
、wait-for-psql.py
这几个文件是生成镜像时需要调用的脚本文件。可以在这下载Dokcer-odoo
odoo.conf ``:项目的配置文件
requirements.txt```:这个是项目的第三方库。
我这里用的是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
启动项文件,文件主要负责搭建项目环境,让项目快速启动。文件结构就不一一解释了 。可以根据自己的需求去改
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
启动项文件配置完成 。
# 服务器安装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执行赋予权限的命令。不过我没试过。这种方法一劳永逸。推荐,以后试试