如何在alpine docker容器中安装python2.6。
我尝试从源代码安装,它给我编译错误。
实际上我想在容器中安装Python2.6和Python2.7。这样我就可以在Python2.6和Python2.7上运行单元测试。请对此提出一些想法。
我已经在高山容器中安装了gcc,g ++,make然后执行了以下步骤。
wget https://www.python.org/ftp/python/2.6/Python-2.6.tgz
tar xvzf Python-2.6.tgz
cd Python-2.6
./configure
make
make时出现此错误,
~/Python-2.6 # make
gcc -c -fno-strict-aliasing -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I. -IInclude -I./Include -DPy_BUILD_CORE -o Modules/config.o Modules/config.c
gcc -c -fno-strict-aliasing -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I. -IInclude -I./Include -DPy_BUILD_CORE -DPYTHONPATH='":plat-linux4:lib-tk:lib-old"' \
-DPREFIX='"/usr/local"' \
-DEXEC_PREFIX='"/usr/local"' \
-DVERSION='"2.6"' \
-DVPATH='""' \
-o Modules/getpath.o ./Modules/getpath.c
gcc -fno-strict-aliasing -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I. -IInclude -I./Include -DPy_BUILD_CORE -c ./Modules/posixmodule.c -o Modules/posixmodule.o
./Modules/posixmodule.c:6173:1: error: conflicting types for 'posix_close'
posix_close(PyObject *self, PyObject *args)
^
In file included from Include/Python.h:44:0,
from ./Modules/posixmodule.c:30:
/usr/include/unistd.h:38:5: note: previous declaration of 'posix_close' was here
int posix_close(int, int);
^
Makefile:1234: recipe for target 'Modules/posixmodule.o' failed
make: *** [Modules/posixmodule.o] Error 1
任何人都可以建议我如何解决这个问题?
答案 0 :(得分:1)
对于python2.7,您可以使用frolvlad/alpine-python2,这是一个基于高山的50MB python2.7图像。
对于python2.6,您可以获取Dockerfile并对其进行更新,以便它也适用于该版本
答案 1 :(得分:1)
Docker有一个official repos,使用起来非常方便。方便的是,有一个python官方回购。它有不同版本的Python(包括2.7)和不同的基本操作系统(包括alpine)的图像。我建议使用官方的 2.7-alphine 图像,并使用its Dockerfile作为安装python 2.6的参考。
我还建议使用单独的图像,一个使用python 2.6,另一个使用2.7,而不是同时使用两个图像。这有助于避免必须并排安装/配置两个不同版本的python。
如果没有看到Dockerfile的其余内容,很难说出为什么你的构建不起作用,但是一个开始的地方是构建依赖项。官方Dockerfile在行37-53上添加了构建依赖项,该列表具有比您所说的安装依赖项更多的依赖项。
答案 2 :(得分:1)
我设法通过调整此问题的补丁来实现这一点:https://bugs.python.org/issue20594到Python 2:
--- ./Modules/posixmodule.c.orig
+++ ./Modules/posixmodule.c
@@ -3896,7 +3896,7 @@
#endif
gid_t grouplist[MAX_GROUPS];
- /* On MacOSX getgroups(2) can return more than MAX_GROUPS results
+ /* On MacOSX getgroups(2) can return more than MAX_GROUPS results
* This is a helper variable to store the intermediate result when
* that happens.
*
@@ -6357,7 +6357,7 @@
Close a file descriptor (for low level IO).");
static PyObject *
-posix_close(PyObject *self, PyObject *args)
+posix_closex(PyObject *self, PyObject *args)
{
int fd, res;
if (!PyArg_ParseTuple(args, "i:close", &fd))
@@ -8602,7 +8602,7 @@
{"tcsetpgrp", posix_tcsetpgrp, METH_VARARGS, posix_tcsetpgrp__doc__},
#endif /* HAVE_TCSETPGRP */
{"open", posix_open, METH_VARARGS, posix_open__doc__},
- {"close", posix_close, METH_VARARGS, posix_close__doc__},
+ {"close", posix_closex, METH_VARARGS, posix_close__doc__},
{"closerange", posix_closerange, METH_VARARGS, posix_closerange__doc__},
{"dup", posix_dup, METH_VARARGS, posix_dup__doc__},
{"dup2", posix_dup2, METH_VARARGS, posix_dup2__doc__},
我在这里发布了我的完整Dockerfile和补丁:
https://gist.github.com/cwill747/722f41d8807c3b41a1e417849634cfe5