Skip to content
This repository has been archived by the owner on Mar 23, 2021. It is now read-only.

Commit

Permalink
chore(docker): 更新微信构建和使用
Browse files Browse the repository at this point in the history
  • Loading branch information
zjZSTU committed Oct 10, 2019
1 parent bd42fd5 commit c87e99a
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 150 deletions.
7 changes: 5 additions & 2 deletions dockerfiles/wechat/docker-entrypoint.sh
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,13 @@ then
exec gosu user "$0" "$@"
fi

/opt/deepinwine/apps/Deepin-WeChat/run.sh > /dev/null 2>&1
APP="WeChat"
APP_NAME="WeChat.exe"

/opt/deepinwine/apps/Deepin-${APP}/run.sh > /dev/null 2>&1
sleep 30s

while test -n "`pidof WeChat.exe`"
while test -n "`pidof ${APP_NAME}`"
do
sleep 1s
done
Expand Down
28 changes: 18 additions & 10 deletions dockerfiles/wechat/wechat.sh
Original file line number Diff line number Diff line change
@@ -1,10 +1,17 @@
#!/bin/bash

COMMAND="/opt/deepinwine/apps/Deepin-WeChat/run.sh"
CONTAINER_NAME="wechat"
IMAGE_NAME="zjzstu/wechat:latest"
APP="WeChat"
CONTAINER="wechat"

IMAGE="zjzstu/${CONTAINER}:latest"
HOST_STORAGE="${HOME}/deepin-wine/${APP} Files"
CONTAINER_STORAGE="/home/user/${APP} Files"

HOST_CONFIGURE="${HOME}/.deepinwine/Deepin-${APP}"
CONTAINER_CONFIGURE="/home/user/.deepinwine/Deepin-${APP}"

APP_COMMAND="/opt/deepinwine/apps/Deepin-WeChat/run.sh"

# 启动wechat镜像
function startup()
{
docker run \
Expand All @@ -18,21 +25,22 @@ function startup()
-e XMODIFIERS="@im=fcitx" \
-e QT_IM_MODULE="fcitx" \
-e GTK_IM_MODULE="fcitx" \
-v ${HOME}/deepin-wine/"WeChat Files":/home/user/"WeChat Files" \
--name ${CONTAINER_NAME} \
-d ${IMAGE_NAME} > /dev/null 2>&1
-v "${HOST_STORAGE}":"${CONTAINER_STORAGE}" \
-v "${HOST_CONFIGURE}":"${CONTAINER_CONFIGURE}" \
--name ${CONTAINER} \
-d ${IMAGE} > /dev/null 2>&1
}

function run()
{
xhost + > /dev/null 2>&1

START=$(docker ps -q --filter="name=${CONTAINER_NAME}")
STOP=$(docker ps -aq --filter="name=${CONTAINER_NAME}")
START=$(docker ps -q --filter="name=${CONTAINER}")
STOP=$(docker ps -aq --filter="name=${CONTAINER}")

if [ -n "${START}" ]
then
docker exec -d -u user $START ${COMMAND} > /dev/null 2>&1
docker exec -d -u user $START ${APP_COMMAND} > /dev/null 2>&1
elif [ -n "${STOP}" ]
then
docker restart ${STOP} > /dev/null 2>&1
Expand Down
157 changes: 19 additions & 138 deletions docs/source/docker/gui/[Docker][deepin-wine]微信运行.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,72 +9,21 @@

## 安装

编写`Dockerfile`如下:
编写`Dockerfile`

```
FROM zjzstu/deepin-wine:latest
LABEL maintainer "zhujian <zjzstu@github.com>"
WORKDIR /app
RUN set -eux && \
apt-get update && \
apt-get install -y wget ttf-wqy-microhei gosu dbus && \
gosu nobody true && \
wget https://mirrors.aliyun.com/deepin/pool/non-free/d/deepin.com.wechat/deepin.com.wechat_2.6.8.65deepin0_i386.deb && \
useradd -s /bin/bash -m user && \
chown -R user:user /app && \
dpkg -i *.deb && \
rm -f *.deb && \
apt-get autoclean -y && apt-get clean -y && \
find /var/lib/apt/lists -type f -delete && \
find /var/cache -type f -delete && \
find /var/log -type f -delete && \
find /usr/share/doc -type f -delete && \
find /usr/share/man -type f -delete
COPY docker-entrypoint.sh ./
RUN chmod a+x docker-entrypoint.sh && \
chown user:user docker-entrypoint.sh && \
ls -al
ENTRYPOINT ["/app/docker-entrypoint.sh"]
```

首先安装中文字体和`gosu`工具;然后设置用户并安装微信,完成后清理多余资源;最后设置入口点程序
1. 安装`wget ttf-wqy-microhei gosu dbus`
2. 创建普通用户`user`,下载微信安装包,修改属主并安装
3. 清理资源
4. 设置启动项`docker-entrypoint.sh`

入口点程序`docker-entrypoint.sh`实现如下:
*注意:不安装中文字体会导致微信中文乱码*

```
#!/bin/bash
if [ "$(id -u)" -eq '0' ]
then
UID=${UID:-9001}
GID=${GID:-9001}
AUDIO_GID=${AUDIO_GID:-9002}
VIDEO_GID=${VIDEO_GID:-9003}
id
usermod -u ${UID} -g ${GID} -a -G root,${AUDIO_GID},${VIDEO_GID} user > /dev/null 2>&1
source dbus start > /dev/null 2>&1
export HOME=/home/user
chown -R ${UID}:${GID} ${HOME} > /dev/null 2>&1
exec gosu user "$0" "$@"
fi
/opt/deepinwine/apps/Deepin-WeChat/run.sh > /dev/null 2>&1
sleep 30s
while test -n "`pidof WeChat.exe`"
do
sleep 1s
done
exit "$?"
```
编写`docker-entrypoint.sh`

* 将用户组`root/音频/视频`加入用户`user`
* 启动`dbus`
1. 获取主机传入的环境变量,包括用户`ID`,用户组`ID`,音频组`ID`,视频组`ID`,修改`user`属性
2. 切换普通用户`user`,启动微信

微信启动后会断开再自动启动,未防止容器停止结束,参考[bestwu/docker-wechat](https://github.com/bestwu/docker-wechat/blob/master/entrypoint.sh),通过`sleep`功能保持容器运行
`deepin-wine`的微信出现的一个问题是第一次运行时会自动结束程序再启动,参考[bestwu/docker-wechat](https://github.com/bestwu/docker-wechat/blob/master/entrypoint.sh),通过`sleep`功能保持容器运行

## 构建

Expand All @@ -87,89 +36,21 @@ zjzstu/wechat latest 9d4352ba37fd 56 seconds ago

## 运行

参考[Ubuntu下使用Tim/Wechat](https://www.gubeiqing.cn/2018/10/27/docker13/?utm_source=tuicool&utm_medium=referral#安装Docker),将主机音频和视频组`ID`传给容器
参考[Ubuntu下使用Tim/Wechat](https://www.gubeiqing.cn/2018/10/27/docker13/?utm_source=tuicool&utm_medium=referral#安装Docker)

微信启动后会在`${HOME}/"WeChat Files"`目录下放置配置信息,将本地`${HOME}/deepin-wine/"WeChat Files"`目录挂载到该位置
* 将主机用户`ID`,用户组`ID`,音频组`ID`和视频组`ID`传入容器
* 挂载本地`deepin-wine`配置目录到容器
* 挂载本地`wechat`配置目录到容器

```
docker run \
--device=/dev/snd:/dev/snd \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-e DISPLAY=unix${DISPLAY} \
-e AUDIO_GID=`getent group audio | cut -d: -f3` \
-e VIDEO_GID=`getent group video | cut -d: -f3` \
-e GID=`id -g` \
-e UID=`id -u` \
-e XMODIFIERS="@im=fcitx" \
-e QT_IM_MODULE="fcitx" \
-e GTK_IM_MODULE="fcitx" \
-v ${HOME}/deepin-wine/"WeChat Files":/home/user/"WeChat Files" \
--name wechat \
-d zjzstu/wechat:latest
```
**注意:每次重新调用微信启动命令,都需要重新登录(好像是`deeping-wine`的设置),所以无法登录多组用户**

## 可执行脚本

在主机新建脚本`wechat.sh`,统一操作`wechat`的启动

```
#!/bin/bash
COMMAND="/opt/deepinwine/apps/Deepin-WeChat/run.sh"
CONTAINER_NAME="wechat"
IMAGE_NAME="zjzstu/wechat:latest"
# 启动wechat镜像
function startup()
{
docker run \
--device=/dev/snd:/dev/snd \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-e DISPLAY=unix${DISPLAY} \
-e AUDIO_GID=`getent group audio | cut -d: -f3` \
-e VIDEO_GID=`getent group video | cut -d: -f3` \
-e GID=`id -g` \
-e UID=`id -u` \
-e XMODIFIERS="@im=fcitx" \
-e QT_IM_MODULE="fcitx" \
-e GTK_IM_MODULE="fcitx" \
-v ${HOME}/deepin-wine/"WeChat Files":/home/user/"WeChat Files" \
--name ${CONTAINER_NAME} \
-d ${IMAGE_NAME} > /dev/null 2>&1
}
function run()
{
xhost + > /dev/null 2>&1
START=$(docker ps -q --filter="name=${CONTAINER_NAME}")
STOP=$(docker ps -aq --filter="name=${CONTAINER_NAME}")
if [ -n "${START}" ]
then
docker exec -d -u user $START ${COMMAND} > /dev/null 2>&1
elif [ -n "${STOP}" ]
then
docker restart ${STOP} > /dev/null 2>&1
else
startup
fi
}
function main()
{
run
exit "$?"
}
main
```

根据`wechat`容器的状态进行不同操作
在主机新建脚本`wechat.sh`,统一操作`wechat`的启动。根据`wechat`容器的状态分`3`种情况

* 没有wechat容器,新建容器操作
* 正在运行,使用`docker exec`命令启动
* 停止运行,重新启动容器
* 没有`wechat`容器运行时执行新建容器操作
* 正在运行容器则使用`docker exec`命令进入容器启动微信程序
* 容器停止运行时执行重启容器操作

将其放置在`/usr/local/bin`目录下,即可在任何地方启动

Expand Down

0 comments on commit c87e99a

Please sign in to comment.