libssl проблема с использованием paramiko и sshtunnel с докером Alpine - PullRequest
0 голосов
/ 06 декабря 2018

Я некоторое время боролся с каким-то процессом, и я решил обратиться за помощью.

У меня есть сценарий, который предполагает загрузку какого-либо файла и передачу его на сервер sftp для пакетной обработки.

Я использую контейнер Alpine Python, и мой Dockerfile выглядит следующим образом:

FROM python:3.7.1-alpine3.8

RUN \
echo "**** install build packages ****" && \
apk add --no-cache --virtual=build-dependencies \
g++ \
gcc \
make \
libffi-dev \
openssl-dev \
openssl \
python-dev && \
echo "**** install pip packages ****" && \
pip install --no-cache-dir -U \
pip && \
pip install --no-cache-dir -U \
cryptography \
paramiko \
sshtunnel \
datetime \
boto3 \
requests \
datetime && \
echo "**** clean up ****" && \
apk del --purge \
gcc \
g++\
make \
build-dependencies && \
rm -rf \
/root/.cache \
/var/cache/apk/* \
/tmp/*

COPY settle.py /
CMD [ "python3", "./settle.py" ]

У меня есть файл с именемorge.py, соответствующий фрагмент которого:

print("creating the tunnel")
  with SSHTunnelForwarder(
      (loaded_json["sftp_jumpbox_address"],int(loaded_json["sftp_jumpbox_port"])),
      ssh_username=loaded_json["sftp_jumpbox_user"],
      ssh_pkey=privateJumpboxKey,
      remote_bind_address=(loaded_json["sftp_target_address"],int(loaded_json["sftp_target_port"])),
      local_bind_address=("127.0.0.1",2222)

  ) as tunnel:
    print("making actual ssh paramiko connection")
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    pemkey = paramiko.RSAKey.from_private_key_file(privateTargetKey)
    client.connect(hostname="127.0.0.1",port=2222,username=loaded_json["sftp_target_user"],pkey=pemkey, look_for_keys=False)
    print("Making the sftp connection")
    sftp = client.open_sftp()
    # filename="testing_20181119114841390.txt"
    # print(loaded_json)
    uploadFolder= targetUploadFolder+"/"
    print("destination file "+ filename)
    sftp.chdir(uploadFolder)
    print("dropping the file into the sftp")
    sftp.put(sourceFileToSend,filename)
    print("Closing the sftp connection")
    sftp.close()
    client.close()

    print("Completing the upload")
except Exception as e:
  print("type error: " + str(e))

Каждый разЯ запускаю его независимо от того, какую комбинацию пакета, python-dev, cryptograpy я устанавливаю. Я все равно получаю следующую ошибку

creating the tunnel type error: Error loading shared library libssl.so.1.0.0: No such file or directory (needed by /usr/local/lib/python3.7/site-packages/cryptography/hazmat/bindings/_openssl.abi3.so)

Между тем этот скрипт на python отлично работает на моем Mac,Я не уверен, что мне не хватает.Буду благодарен, если кто-нибудь сможет пролить немного света.Заранее спасибо

РЕДАКТИРОВАТЬ 1 Я sshed в контейнер, и когда я сделал поиск, ниже то, что я нашел

/ # find / -iname libssl*
/lib/libssl.so.45
/lib/libssl.so.45.0.1
/usr/lib/libssl.so.45
/usr/lib/libssl.so.45.0.1

Прямо сейчас не уверен, какой из нихбиблиотеки нуждается в обновлении, нуждается в символической ссылке на libssl.Поскольку доступная версия является более новой, чем та, которая требуется библиотекой криптографии.

1 Ответ

0 голосов
/ 08 декабря 2018

Попробовав так много других вещей с Alpine, я наткнулся на этот пост из Linux и Unix , где говорится, что он осторожен с написанными на C / C ++ библиотеками python.Поэтому я переключился на дистрибутив на основе Debian, и это было смехотворно просто.Файл Docker ниже работает отлично.

FROM python:3.6-slim-jessie


RUN pip install --no-cache-dir -U \
cffi \
paramiko \
sshtunnel \
datetime \
boto3 \
requests \
datetime && \
echo "**** clean up ****" && \
rm -rf /var/lib/apt/lists/*
COPY settle.py /
CMD [ "python", "./settle.py" ]
...