文章前言
没有什么能够阻挡,你对自由的向往…..,前段时间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
文件是否存在
root@OpenWrtClub:~# 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
文件是否存在和版本信息
root@OpenWrtClub:~# ls /usr/lib/libcrypto*
/usr/lib/libcrypto.so.1.1
建立软连接:
ln -s /usr/lib/libcrypto.so.1.1 /usr/lib/libcrypto.so
查看libssl.so
文件是否存在和版本信息
root@OpenWrtClub:~# 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
安装成功:
root@OpenWrtClub:~# 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 是否能运行
root@OpenWrtClub:~# 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了。。。麻烦啊
@raiuka: 其实不麻烦,主要是依赖麻烦。你需要找我我发给你gcc啥的那些依赖不就行了。
@raiuka: 想折腾一下
测试一下
测试一下
这个试一下吧,
太难了,试试这个看
太棒了,试一试
emmm…终于有大佬踩坑出来了
@hanicc: root@OpenWrt:~# 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.
报错这个,请问有解吗?
@hanicc: 已经试过这个 pip3 install -U setuptools 还是一样@_@
@hanicc: 这个确实很难搞,特别是pynacl,你自己多试试,有时候网络也是个问题。
不会吧还要编译?
测试一下,谢谢
有点蛮烦的折腾
請問是否把該編譯的編譯進去後, 就可以直接進行最後成功的做法?
@kris: 成功了, 感謝你的分享^^
试试 看看能不能用
测试
測試一下
测试一下
@1588084831153: 測試一下
pip3 install docker-compose==1.23.2
这样可以直接装
@666: 可以直接这么来?
@666: 确实!可以!!!!!!!!!!!!!!!!!!!!
亲测成功
測試一下
emmm…终于有大佬踩坑出来了
测试一下
测试一下
我评论了啊我评论了啊
感谢楼主
测试一下
测试一下
我评论了的
看看試試看
测试一下
想放弃compose了。。。麻烦啊
感謝
测试一下
看看試試看
测试一下a
测试一下啊啊啊
评论了为啥不能下载啊
先试一试
大佬,请收下我的膝盖!!
试试
看看咯
root@OpenWrt:~# cp ./openwrt-compose/sodium.h /usr/include/python3.8/
cp: can’t stat ‘./openwrt-compose/sodium.h’: No such file or directory
出现这种错误怎么解决啊?
各种出错啊,不知道怎么解决
测试 一下
想下载文件
再回复一次,看看能否下载文件
测试一下
测试一下
测试下
想放弃compose了。。。麻烦啊
试试
测试一下,谢谢
感谢分享
测试一下
测试一下
还真有一模一样的问题。。。
测试一下
想下载看看 学习一下
暂且一试
可以分享一下依赖吗
测试一下
OK看
谢谢楼主的分享!
麻烦
试一下。。
感谢,尝试一下~
麻烦
安装不上pynacl的,建议直接 pip install docker-compose==1.23.2,立马见效,什么gcc什么make都无需要,直接成功!
想放弃它了,好难安装呀
来用一下大佬的配置
测试测试
怎么下载文件啊?
启动提示sha啥报错
回复咋不能下载文件
下载试试,谢谢
试一下啊
测试能不能安装
不错,正需要,感谢提供思路
终于找到方法了,学习一下
测试下能不能安装,感谢你的教程
我也想有docker-compose 试试看
@afrojewelz: openwrt-compose.tar.gz 下载地址哪?
看看怎么样
测试一下
行不行啊
感谢分享!试试能不能安装。
试一下
尝试一下
折腾好久了,不知道行不行
试一试
测试一下 手上设备不多了
试下看看
好
测试看看
测试下能不能安装,感谢你的教程
先下载文件。无论成功与否,感谢分享一生平安
其实只需要一行命令就够了opkg install docker-compose
试试看能不能
感谢
谢谢大佬分享
测试下
试试看,感谢分享
感谢大佬的分享
感谢大佬分享
测试