Проблема при сборке Dockerfile

Подскажите, правильно ли я составил алгоритм работы Dockerfile? Так как при попытке собрать образ выдает ошибку

 > [5/8] RUN cd C:gobot1cmdpredicter:
#9 0.479 /bin/sh: 1: cd: can't cd to C:gobot1cmdpredicter

executor failed running [/bin/sh -c cd C:\go\bot1\cmd\predicter]: exit code: 2

Вот полный код докера:

FROM golang:1.15

COPY . /bot1/
WORKDIR /bot1/

RUN go mod download
RUN cd C:\go\bot1\cmd\predicter

RUN go build main.go

RUN cd C:\go\bot1\cmd\predicter
RUN start main.exe

Логика такова, копируется директория с файлами проекта, компилируется программа, а затем запускается скомпилированный ехе-шник


Ответы (1 шт):

Автор решения: Senior Pomidor

внутри докерфайла единственный доступ к вашей машине только через COPY или ADD

FROM golang:1.15

COPY . /bot1/
WORKDIR /bot1/

RUN go mod download
RUN go build -o /bot1/api main.go
CMD "/bot1/api"
EXPOSE 8080

теперь по-порядку.

  • COPY . /bot1 - копировать все из контекста в папку bot1 ВНУТРИ контейнера
  • WORKDIR /bot1/ - теперь следующие команды будут выполнены из этой папки
  • RUN go mod download - скачать зависимости
  • RUN go build -o /bot1/api main.go -сбилдить банар. -o означает -output, путь, где появится сбилженный бинарь
  • CMD "/bot1/api" если кто-то запустит конфейнер, то пусть эта программа запустится
  • EXPOSE 8080 - инструкция EXPOSE полезна для проброса портов между контейнерами. Я хочу, чтобы 8080 порт ВНУТРИ контейнера пробросился наружу

выполняем команду

docker build -t myname .
  • myname - это название image-а, который получится в тоге
  • . - контекст, то есть откуда брать файлы. Обычно, Dockerfile лежит рядом с репозиторием, но если это не так, то вы вместо . укажите полный путь до сорсов

как только сбилдили командой выше, то можно посмотреть на нее

➜ docker images
REPOSITORY                              TAG                 IMAGE ID       CREATED         SIZE
myname                                  latest              132b6842aac9   1 hours ago    815MB

теперь можете запустить ваш контейнер docker run myname

контейнер и обораз(image) - разныке вещи. вы собираете образ, чтобы потом из него сделать контейнер.

→ Ссылка