Не могу воссоздать среду Конды в докере
Я создал среду conda из свежей установки miniconda3.
После этого я экспортировал его, и это содержимое файла (моей единственной дополнительной установкой была фляга):
name: myenv
channels:
- defaults
dependencies:
- ca-certificates=2018.03.07=0
- certifi=2018.11.29=py37_0
- click=7.0=py37_0
- flask=1.0.2=py37_1
- itsdangerous=1.1.0=py37_0
- jinja2=2.10=py37_0
- libcxx=4.0.1=hcfea43d_1
- libcxxabi=4.0.1=hcfea43d_1
- libedit=3.1.20170329=hb402a30_2
- libffi=3.2.1=h475c297_4
- markupsafe=1.1.0=py37h1de35cc_0
- ncurses=6.1=h0a44026_1
- openssl=1.1.1a=h1de35cc_0
- pip=18.1=py37_0
- python=3.7.1=haf84260_7
- readline=7.0=h1de35cc_5
- setuptools=40.6.2=py37_0
- sqlite=3.26.0=ha441bb4_0
- tk=8.6.8=ha441bb4_0
- werkzeug=0.14.1=py37_0
- wheel=0.32.3=py37_0
- xz=5.2.4=h1de35cc_4
- zlib=1.2.11=h1de35cc_3
prefix: /Users/rossid/miniconda3/envs/phadmin
Теперь, что я хочу, это воссоздать эту среду в образе Docket, поэтому я создал этот Dockefile
FROM continuumio/miniconda3
ADD * myappdir/
RUN conda env create -f /myappdir/environment.yml
но это не удастся с:
Step 1/5 : FROM continuumio/miniconda3
---> d3c252f8727b
Step 2/5 : ADD * myappdir/
---> Using cache
---> 2afbf5ea75bd
Step 3/5 : RUN conda env create -f /myappdir/environment.yml
---> Running in 7f916bd46979
Solving environment: ...working... failed
ResolvePackageNotFound:
- tk==8.6.8=ha441bb4_0
- ncurses==6.1=h0a44026_1
- markupsafe==1.1.0=py37h1de35cc_0
- readline==7.0=h1de35cc_5
- zlib==1.2.11=h1de35cc_3
- openssl==1.1.1a=h1de35cc_0
- xz==5.2.4=h1de35cc_4
- libcxxabi==4.0.1=hcfea43d_1
- libcxx==4.0.1=hcfea43d_1
- libffi==3.2.1=h475c297_4
- sqlite==3.26.0=ha441bb4_0
- python==3.7.1=haf84260_7
- libedit==3.1.20170329=hb402a30_2
почему это происходит? Если я пытаюсь сделать то же самое, чтобы создать другую среду, это работает. Если я удаляю версию сборки, некоторые зависимости разрешаются (я имею в виду третью координату в зависимостях).
Я пытался добавить больше каналов, таких как conda-forge, но ничего.
Также мой файл.condarc пуст.
Кто-нибудь знает, как это исправить?
2 ответа
У меня была аналогичная проблема, и я нашел несколько способов ее решения. Основная проблема с вашим подходом заключается в том, что conda не зависит от платформы, поэтому заставит среды использовать pip.
1. Конда-подобное решение
Измените свой my_env.yml так, чтобы все зависимости, кроме pip, находились под зависимостью pip. Обратите внимание, что синтаксис отличается, когда вы перемещаетесь под точкой.
Например:
name: myenv
channels:
- defaults
dependencies:
- pip=18.1
- pip:
- wheel==0.32.3
Затем перейдите в свой Dockerfile и добавьте следующую строку:
RUN conda env update -n base --file myenv.yml
2. Старый добрый путь Пипа
Экспортируйте свою среду conda в файл требований pip, как в этом ответе
conda install pip
pip freeze > requirements.txt
Затем перейдите в свой файл Docker и добавьте следующую строку:
RUN python -m pip install -r requirements.txt
Сборка докера не удалась, потому что ваш входной файл yml включает ограничения сборки для конкретной платформы. Например:
ResolvePackageNotFound:
- tk==8.6.8=ha441bb4_0
- ncurses==6.1=h0a44026_1
- markupsafe==1.1.0=py37h1de35cc_0
- readline==7.0=h1de35cc_5
- zlib==1.2.11=h1de35cc_3
- openssl==1.1.1a=h1de35cc_0
- xz==5.2.4=h1de35cc_4
- libcxxabi==4.0.1=hcfea43d_1
- libcxx==4.0.1=hcfea43d_1
- libffi==3.2.1=h475c297_4
- sqlite==3.26.0=ha441bb4_0
- python==3.7.1=haf84260_7
- libedit==3.1.20170329=hb402a30_2
Эти пакеты содержат специфичные для платформы хэши (например,ha441bb4_0
). По сути, вы пытаетесь установить пакеты с платформы ОС на платформу Linux. Вот почему ответ Беркая будет работать в большинстве случаев использования. Более простой способ решить эту проблему - добавитьfrom-history
аргумент при экспорте вашей среды conda.
conda env export -f env_explicit.yml --from-history
Этот аргумент будет включать только пакеты, которые вы явно указали во время установки. Этот аргумент также будет игнорировать любые зависимости от конкретной платформы.
И ваш новый Dockerfile будет выглядеть следующим образом:
FROM continuumio/miniconda3
ADD * myappdir/
RUN conda env create -f /myappdir/env_explicit.yml