2016-08-06 2 views
1

Я хочу установить пакет Python's mysqlclient на контейнер Docker, работающий Ubuntu. Установка не потому, что у меня нет GCC установлен в контейнере:Установить Python mysqlclient на контейнер-докере Ubuntu

x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fno-strict-aliasing -Wdate-time -D_FORTIFY_SOURCE=2 -g -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Dversion_info=(1,3,7,'final',1) -D__version__=1.3.7 -I/usr/include/mysql -I/usr/include/python2.7 -c _mysql.c -o build/temp.linux-x86_64-2.7/_mysql.o -fabi-version=2 -fno-omit-frame-pointer 
    unable to execute 'x86_64-linux-gnu-gcc': No such file or directory 
    error: command 'x86_64-linux-gnu-gcc' failed with exit status 1 

Однако, я не хочу, чтобы установить ГХК в контейнере. Есть ли колесо для mysqlclient? Я не могу найти.

ответ

1

Я создал контейнер и установил все, что мне нужно для создания mysqlclient. Я загрузил .tgz и использовал python setup.py bdist_wheel для генерации файла Wheel. Я скопировал файл с колесом в каталог, установленный с моей главной машины, и установил его в контейнере, где я хотел установить mysqlclient. Таким образом, мне не пришлось удалять загруженные мной пакеты. Я сохранил экземпляр контейнера с gcc как отдельное изображение для будущего использования.

1

Вы можете установить зависимости сборки, создать модуль и удалить их.

Redis is a good example как построить и очистить за один шаг, чтобы вы не создали громоздкий слой изображения.

RUN buildDeps='gcc libc6-dev make' \ 
    && set -x \ 
    && apt-get update && apt-get install -y $buildDeps --no-install-recommends \ 
    && rm -rf /var/lib/apt/lists/* \ 
    && mkdir -p /usr/src/redis \ 
    && curl -sSL "$REDIS_DOWNLOAD_URL" -o redis.tar.gz \ 
    && echo "$REDIS_DOWNLOAD_SHA1 *redis.tar.gz" | sha1sum -c - \ 
    && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \ 
    && rm redis.tar.gz \ 
    && make -C /usr/src/redis \ 
    && make -C /usr/src/redis install \ 
    && rm -r /usr/src/redis \ 
    && apt-get purge -y --auto-remove $buildDeps 
+0

Я думал об этом. Я хотел избежать этого, потому что apt-get показывает, что gcc имеет много зависимостей. Вместо этого я создам другой контейнер, в котором есть все, и создадим колесо, которое я скопирую в контейнер, который я использую. Я предполагаю, что можно создать колесо для Linux и повторно использовать его (я спрашиваю, потому что таких колес не существует). – user2233706

0

Хорошее решение, когда вам нужно скомпилировать материал, но вы не хотите загрязнять свое изображение с помощью сборки, чтобы использовать multi-stage builds.

С многоступенчатой ​​сборкой вы создаете первое изображение со всеми инструментами и данными, необходимыми для компиляции, и затем создаете второе изображение, где вы копируете только результат с первого изображения. Это также полезно, если вам нужны секреты (например, SSH-ключи для доступа к частным репозиториям git), но не нужны эти секреты в конечном изображении.

Смежные вопросы