Docker Build Kitura Sqift Container — файл Shim.h mysql.h не найден

Я пытаюсь перенести свою текущую установку Kitura Dev в реальную рабочую среду, сначала переместив ее в контейнер Docker, а затем перенеся ее в облачного провайдера.

Однако, пытаясь собрать мою установку Docker для Kitura, я столкнулся с проблемами, я не нашел подходящего решения, как их исправить.

Я создаю свой контейнер докеров, используя инструкции с этой страницы https://www.kitura.io/docs/deploying/docker.html

Но я также использую SwiftKuery с MySQL в пакете.

Мой файл инструментов Docker выглядит следующим образом

FROM ibmcom/swift-ubuntu:5.0.2
##FROM swift:5.0.2

LABEL maintainer="IBM Swift Engineering at IBM Cloud"
LABEL Description="Template Dockerfile that extends the ibmcom/swift-ubuntu image."

# We can replace this port with what the user wants
EXPOSE 8080 1024 1025

# Default user if not provided
ARG bx_dev_user=root
ARG bx_dev_userid=1000

# Install system level packages
RUN apt-get update && apt-get dist-upgrade -y
##RUN apt-get update && apt-get install -y sudo libcurl4-openssl-dev openssl libssl-dev pkg-config libmysqlclient-dev

# Add utils files
ADD https://raw.githubusercontent.com/IBM-Swift/swift-ubuntu-docker/master/utils/tools-utils.sh /swift-utils/tools-utils.sh
ADD https://raw.githubusercontent.com/IBM-Swift/swift-ubuntu-docker/master/utils/common-utils.sh /swift-utils/common-utils.sh
RUN chmod -R 555 /swift-utils

# Create user if not root
RUN if [ "$bx_dev_user" != root ]; then useradd -ms /bin/bash -u $bx_dev_userid $bx_dev_user; fi

# Make password not required for sudo.
# This is necessary to run 'tools-utils.sh debug' script when executed from an interactive shell.
# This will not affect the deploy container.
RUN echo "$bx_dev_user ALL=NOPASSWD: ALL" > /etc/sudoers.d/user && \
    chmod 0440 /etc/sudoers.d/user

#Install some further SSL related flaws
##RUN  find / -name libssl.so.1.1 -type f -print

# Bundle application source & binaries
COPY . /swift-project

Я получаю следующую ошибку

[5/24] Compiling Swift Module 'SwiftKueryMySQL' (3 sources)
[6/24] Compiling Swift Module 'KituraContracts' (9 sources)
<module-includes>:1:10: note: in file included from <module-includes>:1:
#include "shim.h"
         ^
/swift-project/.build-ubuntu/checkouts/SwiftKueryMySQL/Sources/CMySQL/shim.h:3:10: error: 'mysql.h' file not found
#include <mysql.h>
         ^
/swift-project/.build-ubuntu/checkouts/SwiftKueryMySQL/Sources/SwiftKueryMySQL/MySQLConnection.swift:21:8: error: could not build C module 'CMySQL'
import CMySQL
       ^

после использования этих команд

docker build -t myapp-build -f Dockerfile-tools .

Первый до сих пор работает

docker run -v $PWD:/swift-project -w /swift-project myapp-build /swift-utils/tools-utils.sh build release

Ошибка появляется при сборке контейнера

У кого-нибудь есть идея, что я могу сделать, чтобы решить эту проблему ...?

ОБНОВИТЬ:

Я попробовал одно предоставленное предложение добавить файл .swift-build-linux с одной записью

swift build -Xcc -I/usr/include/mysql/

В исходные файлы моего проекта.

вверх при выполнении команды:

docker run -v $PWD:/swift-project -w /swift-project myapp-build /swift-utils/tools-utils.sh build release

Кажется, он поднимается, как вы можете видеть ниже ... но все же я сталкиваюсь с той же проблемой :(

Current folder: /swift-project
Command: build
Build configuration: release
Build folder: /swift-project/.build-ubuntu
Compiling the project...
Build configuration: release
Custom build command: swift build -Xcc -I/usr/include/mysql/££
warning: you may be able to install mysqlclient using your system-packager:
     apt-get install libmysqlclient-dev

[1/27] Compiling agentcore ibmras/common/Logger.cpp
[2/27] Compiling agentcore ibmras/common/MemoryManager.cpp
[3/27] Compiling agentcore ibmras/common/Properties.cpp
[4/27] Compiling agentcore ibmras/common/LogManager.cpp
[5/26] Compiling Swift Module 'SwiftKueryMySQL' (3 sources)
[6/26] Compiling Swift Module 'KituraContracts' (9 sources)
[7/26] Compiling Swift Module 'CloudFoundryEnv' (6 sources)
[8/26] Compiling CHTTPParser utils.c
[9/26] Linking ./.build-ubuntu/x86_64-unknown-linux/release/libagentcore.so
[10/26] Compiling CHTTPParser http_parser.c
<module-includes>:1:10: note: in file included from <module-includes>:1:
#include "shim.h"
         ^
/swift-project/.build-ubuntu/checkouts/SwiftKueryMySQL/Sources/CMySQL/shim.h:3:10: error: 'mysql.h' file not found
#include <mysql.h>
         ^
/swift-project/.build-ubuntu/checkouts/SwiftKueryMySQL/Sources/SwiftKueryMySQL/MySQLConnection.swift:21:8: error: could not build C module 'CMySQL'
import CMySQL
       ^
Kais-MacBook-Pro:beautylivery_server_mqsql kaibaier$ docker run -v $PWD:/swift-project -w /swift-project myapp-build /swift-utils/tools-utils.sh build release
Current folder: /swift-project
Command: build
Build configuration: release
Build folder: /swift-project/.build-ubuntu
Compiling the project...
Build configuration: release
Custom build command: swift build -Xcc -I/usr/include/mysql/
warning: you may be able to install mysqlclient using your system-packager:
     apt-get install libmysqlclient-dev

[1/33] Compiling CHTTPParser http_parser.c
[2/39] Compiling CHTTPParser utils.c
[3/65] Compiling Swift Module 'TypeDecoder' (2 sources)
[4/65] Compiling Swift Module 'Socket' (3 sources)
[5/65] Compiling Swift Module 'Signals' (1 sources)
[6/65] Compiling Swift Module 'Logging' (3 sources)
[7/65] Compiling Swift Module 'KituraTemplateEngine' (1 sources)
[8/65] Compiling Swift Module 'Cryptor' (11 sources)
[9/65] Compiling memplugin MemoryPlugin.cpp
[10/65] Compiling Swift Module 'LoggerAPI' (1 sources)
[11/65] Compiling hcapiplugin APIConnector.cpp
[12/65] Linking ./.build-ubuntu/x86_64-unknown-linux/release/libmemplugin.so
[13/65] Compiling envplugin envplugin.cpp
[14/65] Linking ./.build-ubuntu/x86_64-unknown-linux/release/libhcapiplugin.so
[15/65] Compiling cpuplugin cpuplugin.cpp
[16/65] Compiling Swift Module 'SwiftKuery' (49 sources)
[17/65] Compiling Swift Module 'KituraContracts' (9 sources)
[18/65] Compiling Swift Module 'HeliumLogger' (2 sources)
[19/65] Compiling Swift Module 'SSLService' (2 sources)
[20/65] Compiling Swift Module 'Health' (3 sources)
[21/65] Compiling Swift Module 'FileKit' (1 sources)
[22/65] Compiling Swift Module 'Configuration' (5 sources)
[23/65] Compiling agentcore ibmras/monitoring/connector/configuration/ConfigurationConnector.cpp
[24/65] Linking ./.build-ubuntu/x86_64-unknown-linux/release/libenvplugin.so
[25/65] Linking ./.build-ubuntu/x86_64-unknown-linux/release/libcpuplugin.so
[26/65] Compiling agentcore ibmras/monitoring/connector/ConnectorManager.cpp
[27/65] Compiling agentcore ibmras/monitoring/agent/threads/WorkerThread.cpp
[28/65] Compiling agentcore ibmras/monitoring/agent/threads/ThreadPool.cpp
[29/65] Compiling agentcore ibmras/monitoring/agent/SystemReceiver.cpp
[30/65] Compiling agentcore ibmras/monitoring/agent/BucketList.cpp
[31/65] Compiling agentcore ibmras/monitoring/agent/Bucket.cpp
[32/65] Compiling Swift Module 'CloudFoundryEnv' (6 sources)
[33/65] Compiling agentcore ibmras/monitoring/agent/Agent.cpp
[34/65] Compiling agentcore ibmras/monitoring/Plugin.cpp
[35/65] Compiling agentcore ibmras/common/util/sysUtils.cpp
[36/65] Compiling agentcore ibmras/common/util/strUtils.cpp
[37/65] Compiling agentcore ibmras/common/util/LibraryUtils.cpp
[38/65] Compiling agentcore ibmras/common/util/FileUtils.cpp
[39/65] Compiling agentcore ibmras/common/port/linux/Thread.cpp
[40/65] Compiling Swift Module 'SwiftKueryMySQL' (3 sources)
[41/65] Compiling agentcore ibmras/common/port/linux/Process.cpp
[42/65] Compiling agentcore ibmras/common/port/ThreadData.cpp
<module-includes>:1:10: note: in file included from <module-includes>:1:
#include "shim.h"
         ^
/swift-project/.build-ubuntu/checkouts/SwiftKueryMySQL/Sources/CMySQL/shim.h:3:10: error: 'mysql.h' file not found
#include <mysql.h>
         ^
/swift-project/.build-ubuntu/checkouts/SwiftKueryMySQL/Sources/SwiftKueryMySQL/MySQLConnection.swift:21:8: error: could not build C module 'CMySQL'
import CMySQL
       ^

ОБНОВИТЬ :

Кажется, это работает после того, как я добавил эту строку в свои инструменты Dockerfile. :

RUN apt-get update && apt-get install -y sudo libmysqlclient-dev 

... но теперь я получаю новую ошибку, которую я сначала должен исследовать ...

[19/20] Compiling Swift Module 'Beautylivery_Server_New' (1 sources) [20/20] Linking ./.build-ubuntu/x86_64-unknown-linux/release/Beautylivery_Server_New clang-7: error: unable to execute command: Bus error clang-7: error: linker command failed due to signal (use -v to see invocation) <unknown>:0: error: link command failed with exit code 254 (use -v to see invocation)

ОБНОВЛЕНИЕ - Разрешение:

Хорошо, я добавил запись

swift build -Xcc -I/usr/include/mysql/

в новый созданный файл .swift-build-linux в корневом каталоге моего проекта. (раньше у меня была небольшая орфографическая ошибка в строке).

Теперь я смог пройти этот этап процесса докеризации... :)

ОБНОВЛЕНИЕ - НОВАЯ проблема:

Привет, вместе, я столкнулся с новой проблемой, связанной с учебником, и она заключается в запуске контейнера после его сборки: поскольку я предполагаю, что это другая тема, я поднял новый вопрос: Запуск образа Kitura Docker вызывает ошибку libmysqlclient.so.18

дело в том, что при запуске контейнера я получаю сообщение об ошибке:

error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory

Большое спасибо за помощь !


person Bliv_Dev    schedule 14.08.2019    source источник


Ответы (1)


Проблема здесь в том, что образ ibmcom/swift-ubuntu:5.0.2 создан поверх Ubuntu 14.04. Версия libmysqlclient-dev, поставляемая с 14.04, не включает информацию pkg-config, которая позволяет компилятору Swift находить заголовки без посторонней помощи.

Есть два решения этой проблемы:

1: Вы можете добавить -Xcc -I/usr/include/mysql/ аргументов в команду swift build. Либо:

  • замените команду, которую вы выполняете в контейнере сборки, на swift build -Xcc -I/usr/include/mysql/ или
  • если вы хотите продолжать использовать сценарий tools-utils.sh, вы можете создать в своем проекте файл с именем .swift-build-linux, который содержит одну строку: swift build -Xcc -I/usr/include/mysql/ — это будет выбрано сценарием tools-utils.sh при запуске сборки.

2: Вы можете заменить свои базовые образы на FROM swift:5.0.2 (для образа сборки) и FROM swift:5.0.2-slim (для образа запуска) — это официальные образы, поддерживаемые Swift, которые основаны на Ubuntu 18.04, и начиная с выпуска Swift 5.0.2, предоставить «тонкий» образ, похожий на «рабочий» образ ibmcom.

  • Обратите внимание, что эти образы не связывают зависимости libssl-dev или libcurl4-openssl-dev, поэтому вам нужно будет включить их в свой файл Dockerfile-tools.
person David Jones    schedule 14.08.2019
comment
Эй, спасибо за полезный ответ ... подход номер два, который я уже пробовал, резко потерпел неудачу с темами ssl, которые вы описали. на самом деле мне нужно было переосмыслить возможность использования исходного пакета от IBM. - person Bliv_Dev; 17.08.2019
comment
Теперь я попробовал ваше первое предложение с пунктом 2. Я попытался напрямую найти файл .swift-build-linux в корневой структуре моего проекта. Тот же уровень, что и исходный каталог. НО это, кажется, не помогает. - person Bliv_Dev; 17.08.2019
comment
Я переместил файл в каталог Sources, и он, кажется, подхватил его... но все равно выдает ту же ошибку. - person Bliv_Dev; 17.08.2019
comment
Кажется, это работает после того, как я добавил эту строку в свои инструменты Dockerfile. : RUN apt-get update && apt-get install -y sudo libmysqlclient-dev ... но теперь я получаю новую ошибку, которую я сначала должен исследовать ... [19/20] Компиляция модуля Swift 'Beautylivery_Server_New' (1 источник) [20/20] Связывание ./.build-ubuntu/x86_64-unknown-linux/release/Beautylivery_Server_New clang-7: ошибка: невозможно выполнить команду: ошибка шины clang-7: ошибка: команда компоновщика не удалась из-за сигнала (используйте - v, чтобы увидеть вызов) ‹неизвестно›:0: ошибка: команда соединения не удалась с кодом выхода 254 (используйте -v, чтобы увидеть вызов) - person Bliv_Dev; 17.08.2019
comment
Хорошо, понял... мне нужно снова переместить файл из исходного каталога. раньше у меня были небольшие ошибки при вводе файла... теперь вроде работает.... 100 ! Спасибо, Дэвид Джонс :) - person Bliv_Dev; 17.08.2019
comment
@Bliv_Dev Есть новости по этому вопросу? Я также столкнулся с этим. Есть ли сейчас серебряная пуля? Немного сложно понять, какому из этих предложений следовать... Пока я попробую их по одному... а также: нужно ли как-то устанавливать mysql в докере? - person Jonny; 25.12.2019
comment
Эй, Джонни, мне помогла быстрая сборка -Xcc -I/usr/include/mysql/, вы можете найти ее в обновлении. Если вы немного подробнее опишете свою проблему, я могу помочь. - person Bliv_Dev; 12.01.2020