OpenWrt Club OpenWrt Club
  • 注册
  • 登录
  • 首页
  • OpenWrt系统
  • OpenWrt插件
  • OpenWrt固件
  • 友人帐
  • OpneWrt 论坛
首页 › OpenWrt系统 › 如何在 OpenWrt 中安装Docker Compose

如何在 OpenWrt 中安装Docker Compose

萝卜
1年前OpenWrt系统
3,077 47 7

文章前言

没有什么能够阻挡,你对自由的向往…..,前段时间Lean在固件中加入了luci-app-docker插件,让OpenWrt也能用上Docker,这简直是个天大的喜讯,所以这几天一直没闲着,一直想在OpenWrt的系统里安装一个Docker Compose来编排我的WEB环境,虽然说官方没有提供ARM版但是可以利用PIP来安装,这个在树莓派上一直使用。但是在OpenWrt系统上我估计没有人这样做,因为毕竟是个路由器系统,有些在路由器上的固件因为硬件的原因根本不需要也不太可能。

我首先尝试利用PIP来直接安装,不管是在x86_64还是树莓派ARM平台上都没有成功,利用官方的bin二进制文件安装也徒劳,所以只能靠自己,没想到这是一个大坑,我足足踩了三天,不过最终还是成功,这里就做一个笔记,也让有需要的朋友一起玩起来。

编译依赖

利用Python的pip安装Docker Compose 需要很多依赖,所以你在编译固件的时候需要选择一下内容

  • GCC
  • Make
  • python3
  • python3-dev
  • python3-pip
  • python3-six
  • python3-cffi
  • python3-openssl
  • python3-cryptography

其实Python3是可以在官方源中直接利用OPKG 来在线安装的,像GCC这些需要自己手动编译。

确认没有选中PyYAML,不然你可能遇到以下报错:

ERROR: Cannot uninstall 'PyYAML'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.

因为写这篇文章我是拿x86平台复现的,所以没有选择上PyYAML所以没有遇到,这里做个提示,如果你真的遇到了可以尝试一下方法来安装

pip3 install --ignore-installed PyYAML

如果还有其他的问题,你可以在本文下方留言。

第一种尝试

刷入系统后先更新一下pip版本,网络环境原因你可能需要开全局自然与科学:

pip3 install --upgrade pip

更新完成后安装Docker Compose

pip3 install docker-compose

第一次安装的时候bcrypt报错无法安装,报错如下:

build/temp.linux-x86_64-3.7/_bcrypt.c:22:24: fatal error: pyconfig.h: No such file or directory

这是我第一次尝试的时候没有编译python3-dev的缘故,如果你加入了其实还是报错,只能手动安装:

wget https://dl.openwrt.club/annex/compose/bcrypt-3.1.7.tar.gz
tar zxf bcrypt-3.1.7.tar.gz
cd bcrypt-3.1.7
python3 setup.py install

如果你看到以下内容说明安装成功:

Finished processing dependencies for bcrypt==3.1.7

继续安装:

pip3 install docker-compose

这次PyNaCl 安装报错,下载手动安装

wget https://dl.openwrt.club/annex/compose/PyNaCl-1.3.0.tar.gz
tar zxf PyNaCl-1.3.0.tar.gz
cd PyNaCl-1.3.0/
python3 setup.py install

但还是会报错:

checking for grep that handles long lines and -e... configure: error: no acceptable grep could be found in /usr/sbin:/usr/bin:/sbin:/bin:/usr/xpg4/bin
Traceback (most recent call last):
  File "setup.py", line 255, in <module>
    "Programming Language :: Python :: 3.7",
  File "/__init__.py", line 145, in setup
  File "/core.py", line 148, in setup
  File "/dist.py", line 966, in run_commands
  File "/dist.py", line 985, in run_command
  File "/install.py", line 67, in run
  File "/install.py", line 109, in do_egg_install
  File "/cmd.py", line 313, in run_command
  File "/dist.py", line 985, in run_command
  File "/bdist_egg.py", line 171, in run
  File "/cmd.py", line 313, in run_command
  File "/dist.py", line 985, in run_command
  File "setup.py", line 171, in run
    cwd=build_temp,
  File "/subprocess.py", line 363, in check_call
subprocess.CalledProcessError: Command '['/root/PyNaCl-1.3.0/src/libsodium/configure', '--disable-shared', '--enable-static', '--disable-debug', '--disable-dependency-tracking', '--with-pic', '--prefix', '/root/PyNaCl-1.3.0/build/temp.linux-x86_64-3.7']' returned non-zero exit status 1.

我把时间几乎都耗在了安装PyNaCl上,

第二种尝试

自己构建一个PyNaCl直接编译进固件。

cd openwrt/feeds/packages/lang/python/
mkdir pynacl
vim Makefile

把一下内容粘贴进去

#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#

include $(TOPDIR)/rules.mk

PKG_NAME:=python-pynacl
PKG_VERSION:=1.3.0
PKG_RELEASE:=1

PKG_SOURCE:=PyNaCl-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://files.pythonhosted.org/packages/source/P/PyNaCl
PKG_HASH:=0c6100edd16fefd1557da078c7a31e7b7d7a52ce39fdca2bec29d4f7b6e7600c

PKG_BUILD_DIR:=$(BUILD_DIR)/$(BUILD_VARIANT)-pynacl-$(PKG_VERSION)

PKG_LICENSE:=Apache-2.0
PKG_LICENSE_FILES:=LICENSE
PKG_MAINTAINER:=Bruce Thompson <[email protected]>, Alexandru Ardelean <[email protected]>

HOST_PYTHON_PACKAGE_BUILD_DEPENDS:="cffi>=1.4.1"
HOST_PYTHON3_PACKAGE_BUILD_DEPENDS:="cffi>=1.4.1"

include $(INCLUDE_DIR)/package.mk
include ../python-package.mk
include ../python3-package.mk

PYTHON_PKG_SETUP_VARS:= SODIUM_INSTALL=system
PYTHON3_PKG_SETUP_VARS:= SODIUM_INSTALL=system
RSTRIP:=:
#TARGET_CFLAGS:=
#TARGET_LDFLAGS:=

PKG_UNPACK:=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)

define Package/python-pynacl/Default
  SECTION:=lang
  CATEGORY:=Languages
  SUBMENU:=Python
  TITLE:=Networking and Cryptography (NaCl) library
  URL:=https://pynacl.readthedocs.io/en/stable/
  DEPENDS+=libsodium @!LIBSODIUM_MINIMAL
endef

define Package/python-pynacl
$(call Package/python-pynacl/Default)
  DEPENDS+= \
      +PACKAGE_python-pynacl:python-light \
      +PACKAGE_python-pynacl:python-cffi \
      +PACKAGE_python-pynacl:python-six
  VARIANT:=python
endef

define Package/python3-pynacl
$(call Package/python-pynacl/Default)
  DEPENDS+= \
      +PACKAGE_python3-pynacl:python3-light \
      +PACKAGE_python3-pynacl:python3-cffi \
      +PACKAGE_python3-pynacl:python3-six
  VARIANT:=python3
endef

define Package/python-pynacl/description
Python binding to the Networking and Cryptography (NaCl) library
endef

define Package/python3-pynacl/description
$(call Package/python-pynacl/description)
.
(Variant for Python3)
endef

$(eval $(call PyPackage,python-pynacl))
$(eval $(call BuildPackage,python-pynacl))
$(eval $(call BuildPackage,python-pynacl-src))

$(eval $(call Py3Package,python3-pynacl))
$(eval $(call BuildPackage,python3-pynacl))
$(eval $(call BuildPackage,python3-pynacl-src))

更新一下feeds的packages:

./scripts/feeds update -a
./scripts/feeds install -a

运行make menuconfig进入配置界面,选择Languages--->Python--->python3-pynacl-src,保存后退出后编译刷入。

别抱太大希望依然是报错,但是这次cryptography竟然也报错,我都编译进去了还是报错,所以手动下载安装,只要报错的手动下载。

wget https://dl.openwrt.club/annex/compose/cryptography-2.8.tar.gz
tar zxf cryptography-2.8.tar.gz
cd cryptography-2.8
python3 setup.py install

最终解决办法

反反复复无法解决这个问题,但好在搜索错误答案的时候找到一篇Home Assistant的文章也是需要用到PyNaCl,跟着脚本做了一遍竟然顺利完成安装。

新建目录:

mkdir -p /usr/include/ffi

下载文件:

需要的文件
下载后上传到路由器解压

下载后将文件上传到OpenWrt设备上并解压

tar zxf openwrt-compose.tar.gz

拷贝文件到指定目录

cp ./openwrt-compose/ffi* /usr/include/ffi/

查看libffi.so文件是否存在

[email protected]:~# ls /usr/lib/libffi.so*
/usr/lib/libffi.so.6      /usr/lib/libffi.so.6.0.4

建立软连接

ln -s /usr/lib/libffi.so.6.0.4 /usr/lib/libffi.so

查看libcrypto文件是否存在和版本信息

[email protected]:~# ls /usr/lib/libcrypto*
/usr/lib/libcrypto.so.1.1

建立软连接:

ln -s /usr/lib/libcrypto.so.1.1 /usr/lib/libcrypto.so

查看libssl.so文件是否存在和版本信息

[email protected]:~# ls /usr/lib/libssl.so*
/usr/lib/libssl.so.1.1

建立软连接:

ln -s /usr/lib/libssl.so.1.1 /usr/lib/libssl.so

安装 libsodium

opkg install libsodium

系统默认是有安装的,运行上面的可以更新到最新版本

cp ./openwrt-compose/sodium.h /usr/include/python3.7/
cp -r ./openwrt-compose/sodium /usr/include/python3.7/

建立软连接:

ln -s /usr/lib/libsodium.so.23.3.0 /usr/lib/libsodium.so

尝试安装PyNaCl,在终端执行以下命令:

SODIUM_INSTALL=system pip3 install pynacl

安装成功:

[email protected]:~# SODIUM_INSTALL=system pip3 install pynacl
Collecting pynacl
  Using cached https://files.pythonhosted.org/packages/61/ab/2ac6dea8489fa713e2b4c6c5b549cc962dd4a842b5998d9e80cf8440b7cd/PyNaCl-1.3.0.tar.gz
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
    Preparing wheel metadata ... done
Requirement already satisfied: cffi>=1.4.1 in /usr/lib/python3.7/site-packages (from pynacl) (1.13.0)
Requirement already satisfied: six in /usr/lib/python3.7/site-packages (from pynacl) (1.12.0)
Requirement already satisfied: pycparser in /usr/lib/python3.7/site-packages (from cffi>=1.4.1->pynacl) (2.19)
Building wheels for collected packages: pynacl
  Building wheel for pynacl (PEP 517) ... done
  Created wheel for pynacl: filename=PyNaCl-1.3.0-cp37-cp37-linux_x86_64.whl size=87953 sha256=865c140e103a28b17580062b724bb4799bee1458237f3ba61fbe446499abf303
  Stored in directory: /tmp/.cache/wheels/c1/10/e7/66597ff71adf8cb7403527243c4b57c66a0d1dfdd8adf2eae4
Successfully built pynacl
Installing collected packages: pynacl
Successfully installed pynacl-1.3.0

安装Compose

pip3 install docker-compose

看到以下信息说明安装成功

Installing collected packages: certifi, urllib3, idna, chardet, requests, texttable, jsonschema, websocket-client, docopt, docker-pycreds, paramiko, docker, dockerpty, cached-property, PyYAML, docker-compose
    Running setup.py install for texttable ... done
    Running setup.py install for docopt ... done
    Running setup.py install for dockerpty ... done
    Running setup.py install for PyYAML ... done
Successfully installed PyYAML-3.13 cached-property-1.5.1 certifi-2019.9.11 chardet-3.0.4 docker-3.7.3 docker-compose-1.24.1 docker-pycreds-0.4.0 dockerpty-0.4.1 docopt-0.6.2 idna-2.7 jsonschema-2.6.0 paramiko-2.6.0 requests-2.20.1 texttable-0.9.1 urllib3-1.24.3 websocket-client-0.56.0

测试docker-compose 是否能运行

[email protected]:~# docker-compose --version
docker-compose version 1.24.1, build 4667896

成功的在OpenWrt上安装了docker-compose 1.24.1的版本,接下来就交给你发挥了。

我这次复现是在x86_64平台上完成的,因为之前为了刷机方便我在树莓派上折腾,期间还尝试了很多很多错误的方法但是没有记录下来。再是笔记的原因这篇文章我罗啰索索的记录了整个过程,目前我的树莓派和一个软路由都成功的安装docker-compose,接下来我可能还会记录一下如何在OpenWrt上使用docker-compse 搭建网站开发环境。

Compose Docker OpenWrt
7
本文系作者 @萝卜 原创发布在 OpenWrt Club。未经许可,禁止转载。
Docker上运行Lean大源码编译的OpenWRT(初稿)
上一篇
OpenWrt 利用docker-compose 搭建网站环境
下一篇
评论 (47)
再想想
  • raiuka

    想放弃compose了。。。麻烦啊

    1年前
    • Luobo

      @raiuka: 其实不麻烦,主要是依赖麻烦。你需要找我我发给你gcc啥的那些依赖不就行了。

      1年前
  • wenchangshou

    测试一下

    1年前
  • 123

    测试一下

    1年前
  • ywb

    这个试一下吧,

    1年前
  • 1579591957603

    太难了,试试这个看

    1年前
  • 呵呵哒

    太棒了,试一试

    12月前
  • hanicc

    emmm…终于有大佬踩坑出来了

    12月前
    • hanicc

      @hanicc: [email protected]:~# SODIUM_INSTALL=system pip3 install pynacl
      Collecting pynacl
      Using cached PyNaCl-1.3.0.tar.gz (3.4 MB)
      Installing build dependencies … error
      ERROR: Command errored out with exit status 1: /usr/bin/python3 /usr/lib/python3.7/site-packages/pip install –ignore-installed –no-user –prefix /tmp/pip-build-env-tas6d6j5/overlay –no-warn-script-location -v –no-binary :none: –only-binary :none: -i https://pypi.org/simple — setuptools wheel ‘cffi>=1.4.1; python_implementation != ‘”‘”‘PyPy'”‘”” Check the logs for full command output.

      报错这个,请问有解吗?

      12月前
    • hanicc

      @hanicc: 已经试过这个 pip3 install -U setuptools 还是一样@[email protected]

      12月前
    • 萝卜

      @hanicc: 这个确实很难搞,特别是pynacl,你自己多试试,有时候网络也是个问题。

      11月前
  • Yuki

    不会吧还要编译?

    11月前
  • 1583196855325

    测试一下,谢谢

    11月前
  • leo

    有点蛮烦的折腾

    11月前
  • kris

    請問是否把該編譯的編譯進去後, 就可以直接進行最後成功的做法?

    10月前
    • kris

      @kris: 成功了, 感謝你的分享^^

      10月前
  • 度

    试试 看看能不能用

    9月前
  • cwzsquare

    测试

    9月前
  • eian

    測試一下

    9月前
  • 1588084831153

    测试一下

    9月前
    • 666

      @1588084831153: 測試一下

      9月前
  • 666

    pip3 install docker-compose==1.23.2
    这样可以直接装

    9月前
    • 萝卜

      @666: 可以直接这么来?

      9月前
  • 打醬油

    測試一下

    9月前
  • JungleYang

    emmm…终于有大佬踩坑出来了

    8月前
  • rule

    测试一下

    8月前
  • pikaqiu

    测试一下

    8月前
  • JungleYang

    我评论了啊我评论了啊

    8月前
  • pikaqiu

    感谢楼主

    7月前
  • hua222

    测试一下

    7月前
  • 测试一下

    测试一下

    7月前
  • 我评论了的

    我评论了的

    7月前
  • rex

    看看試試看

    6月前
  • digger

    测试一下

    6月前
  • JungleYang

    想放弃compose了。。。麻烦啊

    5月前
  • miky

    感謝

    5月前
  • lok

    测试一下

    5月前
  • lok

    看看試試看

    5月前
  • 123

    测试一下a

    5月前
  • 123

    测试一下啊啊啊

    5月前
  • 123

    评论了为啥不能下载啊

    5月前
  • ram

    先试一试

    5月前
  • Aex

    大佬,请收下我的膝盖!!

    4月前
  • yy

    试试

    4月前
  • 从v的

    看看咯

    4月前
  • 非攻非白

    [email protected]:~# cp ./openwrt-compose/sodium.h /usr/include/python3.8/
    cp: can’t stat ‘./openwrt-compose/sodium.h’: No such file or directory
    出现这种错误怎么解决啊?

    2月前
  • 非攻非白

    各种出错啊,不知道怎么解决

    2月前
  • 文章前言
  • 编译依赖
  • 第一种尝试
  • 第二种尝试
  • 最终解决办法
  • 安装Compose
47 7
相关文章
OpenWrt 使用 Luci-app-frpc 配合Docker 内网穿透
OpenWrt 利用Docker 搭建Cloud Torrent 下载BT/PT种子
Ubuntu 18.04 编译OpenWRT遇到libwebsockets 重复问题
Ubuntu 18.04 编译OpenWRT遇到错误和解决办法
Copyright © 2019-2021 OpenWrt Club. Designed by nicetheme.
  • 首页
  • OpenWrt系统
  • OpenWrt插件
  • OpenWrt固件
  • 友人帐
  • OpneWrt 论坛
热门搜索
  • OpenWrt
  • Docker
  • 固件编译
  • 树莓派
  • LEDE
  • 个性修改
  • 服务器
  • Adguard
  • OpenWrt功能
  • Compose
  • 网站环境
  • PassWall
  • Ubuntu
  • OpenSSL
  • Torrent
  • BT下载
  • PT下载
  • 内网穿透
萝卜
13 文章
29 评论
67 喜欢
  • 7
  • 47
  • Top