Когда я пытаюсь создать следующий файл Docker с помощью командной строки docker build -t my-image-name .
FROM continuumio/miniconda3
EXPOSE 8880
# Set working directory
WORKDIR /my-workingdir
# Add scripts to docker workdir
ADD Dockerfile .
ADD environment.yml .
ADD all-my-python-files.py .
# Update & installation of linux packages
RUN apt-get update -y && \
apt-get install -y libgl1-mesa-glx apt-utils && \
apt-get install -y openssh-server && \
apt-get install -y net-tools
# Conda update and creation of environment
RUN conda update conda \
&& conda env create -f environment.yml \
# Activation of environment
&& echo "source activate environment" > ~/.bashrc
# Mount volumes
VOLUME /my-workingdir/Input
CMD ["python" , "execute_given_python_file.py"]
Во время сборки я получаю сообщение об ошибке: /bin/sh: 1: : not found
Я создаю образ в macOS Hihg Sierra Version 10.13.6, но когда я создаю образ в среде Linux CentOS (внутри другого контейнера Docker), Dockerfile работает отлично. Версия Docker, которую я использую на Mac,
Я пробовал следующее:
Но я все равно получаю ошибки. Как решить проблему?
ОБНОВИТЬ: Последние строки перед появлением сообщения об ошибке во время построения изображения:
Получить: 6 http://security.debian.org/debian-security stretch / updates / основных пакетов amd64 [490 kB] Получить: 7 http://deb.debian.org/debian stretch-updates / основных пакетов amd64 [5476 B] Получить: 8 пакетов http://deb.debian.org/debian stretch / main amd64 [9500 kB] Получено 10,3 МБ за 2 секунды (4564 кБ / с) Чтение списков пакетов ... / bin / sh: 1:: не найдено
Докер возвращает ненулевой код: 127
Чтобы воспроизвести ошибку, я включаю скрипт python и среду yml.
Скрипт Python all-my-python-files.py протестирован во время ошибки:
# Name of file: all-my-python-files.py
import openpyxl
import requests
import datetime as dt
import time
from pandas.io.json import json_normalize
import argparse
import os
import pandas as pd
print("At this point, libraries should be imported")
print("End of python script")
Файл environment.yml:
name: environment
channels:
- statiskit
- anaconda
- conda-forge
- defaults
dependencies:
- asn1crypto=0.24.0
# For space the following line are not separated into single lines:
- cffi = 1.11.5 - chardet = 3.0.4 - криптография = 2.3.1 - et_xmlfile = 1.0.1 - idna = 2,7 - jdcal = 1,4 - openpyxl = 2.5.5 - pycparser = 2,18 - pyopenssl = 18.0.0 - писок = 1.6.8 - запросы = 2.19.1 - urllib3 = 1,23 - ca-сертификаты = 2018.8.24 - openssl = 1.0.2p - время = 1,7 - blas = 1.0 - certifi = 2018.8.24 - intel-openmp = 2018.0.3 - libedit = 3.1.20170329 - libffi = 3.2.1 # - libgfortran = 3.0.1 # Не работает в Linux - mkl = 2018.0.3 - mkl_fft = 1.0.4 - mkl_random = 1.0.1 - ncurses = 6.1 - numpy = 1.15.1 - numpy-base = 1.15.1 - панды = 0,23,4 - пункт = 10.0.1 - python = 3.7.0 - python-dateutil = 2.7.3 - pytz = 2018.5 - readline = 7.0 - setuptools = 40.2.0 - шесть = 1.11.0 - sqlite = 3.24.0 - tk = 8,6,8 - колесо = 0,31,1 - xz = 5.2.4 - zlib = 1.2.11 # - libcxx = 4.0.1 # Не работает в Linux # - libcxxabi = 4.0.1 # Не работает в Linux - пункт: - datetime == 4.2 - zope.interface == 4.5.0 префикс: / Users / Elias / miniconda3 / envs / xlshp
Строки журнала похожи на Linux. Фактически, файлы python хорошо работают, когда я создаю образ в системе CentOS linux. Я включил в сообщение последние строки перед ошибкой.
Нас не волнует, является ли вывод журнала «Linux-подобным». Мы заботимся о том, есть ли в файле новые строки CRLF или LF. Если вы попытаетесь запустить скрипт с переводом строки CRLF с интерпретатором, который распознает только новые строки LF, каждая строка будет иметь CR - невидимый символ - на конце, что делает ваши команды недействительными.
Тем не менее, размещение set -x; в начале любой неудачной команды RUN - хорошее место для начала. (Таким образом, RUN set -x; apt-get update -y или RUN set -x; conda update conda).
... также, вообще говоря, работа с .bashrc для сервисов в целом - это запах кода. .bashrc предназначен для использования для настройки оболочек интерактивный и гарантированно будет вызываться только для интерактивных оболочек (и не для всех интерактивных оболочек, а только для тех, которые не являются оболочками входа в систему). Когда вы используете его для настройки неинтерактивной службы, вы делаете это неправильно.
Кстати, было бы полезно, если бы у вас был минимальный воспроизводимый пример - код, который кто-то другой мог бы запустить самостоятельно, чтобы увидеть ту же проблему. Прямо сейчас нам нужны environment.yml и all-my-python-files.py и другие вещи, которых вы не включаете. Не могли бы вы попытаться сократить до самого короткого файла Dockerfile, который может запустить кто-то другой, не внося никаких изменений, чтобы самому увидеть проблему?
@CharlesDuffy, я добавил пару файлов (yml и py), которые снова вызвали ошибку. Спасибо за ваши комментарии.
Чтобы отформатировать текст как блок кода, выберите его и нажмите кнопку {}. Также обратите внимание, что руководство минимальный воспроизводимый пример инструктирует вас создать код кратчайший возможный, который генерирует текущую проблему (и, таким образом, может использоваться для проверки правильности ответов) при запуске кем-то другим. См. Раздел «Уловки для обрезки» на sscce.org, чтобы узнать, как это сделать.


Как упомянул @Charler Duffy, проблема связана с невидимым концом строк в скрипте. Каким-то образом, написание кода следующим образом решило проблему:
RUN apt-get update
RUN apt-get install -y libgl1-mesa-glx apt-utils openssh-server net-tools
# Conda update and creation of environment
RUN conda update conda && \
conda env create -f environment.yml && \
# Activation of environment and correction of bash
echo "source activate xlshp_env" > ~/.bash
Поэтому, когда все пакеты Linux были установлены в одной строке, Dockerfile мог построить образ.
Вы можете проверить, являются ли возвращаемые строки unix-подобными или Windows-подобными, и изменить их (возможно, в ваших файлах python).