Использование команды RUN в Dockerfile в Windows и Linux - PullRequest
1 голос
/ 04 июня 2019

В моем Dockerfile у меня есть

FROM microsoft/dotnet:2.1-sdk
COPY devops/scripts/setup.sh .
RUN ls
RUN chmod +x ./setup.sh 
RUN ./setup.sh
WORKDIR /app

Шаг 3 Я использую только, чтобы показать, что файл действительно присутствует.

При использовании в docker-compose это прекрасно работает на Linux , но при запуске docker-compose up на Windows это приводит к

> docker-compose up
Building create_template
Step 1/6 : FROM microsoft/dotnet:2.1-sdk
 ---> 511c1f563ce6
Step 2/6 : COPY devops/scripts/setup.sh .
 ---> 3d3bb4ab9bc4
Step 3/6 : RUN ls
 ---> Running in 43ad6e244ed8
bin
boot
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
setup.sh     <--- 
srv
sys
tmp
usr
var
Removing intermediate container 43ad6e244ed8
 ---> aa32210d6a87
Step 4/6 : RUN chmod +x ./setup.sh
 ---> Running in 2d6858495355
Removing intermediate container 2d6858495355
 ---> 5e0388623851
Step 5/6 : RUN ./setup.sh
 ---> Running in abb3a52fe6ec
/bin/sh: 1: ./setup.sh: not found
ERROR: Service 'create_template' failed to build: The command '/bin/sh -c ./setup.sh' returned a non-zero code: 127

Есть ли способ использовать одинаковые файлы и команды dockerimage в обеих системах, или мне нужноесть альтернативные dockerimage и docker-compose для каждого?Спасибо

1 Ответ

1 голос
/ 04 июня 2019

Я попробовал ваш пример на Windows и воспроизвел вашу проблему.

Основная причина в том, что когда вы обновляете файл setup.sh на Windows, это dos format.Вам нужно использовать git-bash или другой подобный файл, чтобы заранее перенести формат файла на хосте на unix format перед сборкой или сборкой, например:

dos2unix setup.sh

Другой способ - сделать это в Dockerfile,и это также совместимо, когда вы используете хост Linux, что-то вроде следующего:

RUN apt-get update && apt-get install -y dos2unix && dos2unix setup.sh
RUN ./setup.sh
...