Go приложения завершаются с ошибками и завершают работу при использовании docker-compose, но отлично работают с командой docker run - PullRequest
0 голосов
/ 29 октября 2018

Я выполняю все эти операции на удаленном сервере, который является ВМ под управлением Ubuntu 16.04.5 x64 .

Dockerfile проекта My Go выглядит так:

FROM golang:latest

ADD . $GOPATH/src/example.com/myapp
WORKDIR $GOPATH/src/example.com/myapp
RUN go build

#EXPOSE 80

#ENTRYPOINT $GOPATH/src/example.com/myapp/myapp
ENTRYPOINT ./myapp
#CMD ["./myapp"]

Когда я запускаю Docker-контейнер, используя docker-compose up -d, приложение Go закрывается, и я вижу это в журналах Docker:

myapp_1 | / bin / sh: 1: ./myapp: ошибка формата exec docker_myapp_1 выход с кодом 2

Если я нахожу изображение с помощью docker images и запускаю изображение как:

 docker run -it 75d4a95ef5ec 

Я вижу, что мои приложения golang работают нормально:

Среда viper: разработка HTTP-сервера, прослушивающего по адресу: ": 3005"

Когда я погуглил на эту ошибку, некоторые люди предложили скомпилировать с некоторыми специальными флагами, но я запускаю этот контейнер на том же хосте Ubuntu, поэтому я действительно растерялся, почему это не работает с помощью Docker.

Мой docker-compose.yml выглядит так:

version: "3"

services:
  openresty:
    build: ./openresty
    ports:
     - "80:80"
     - "443:443"
    depends_on:
      - myapp
    env_file:
     - '.env'
    restart: always

  myapp:
    build: ../myapp
    volumes:
     - /home/deploy/apps/myapp:/go/src/example.com/myapp
    ports:
      - "3005:3005"
    depends_on:
      - db
      - redis
      - memcached
    env_file:
      - '.env'

  redis:
    image: redis:alpine
    ports:
    - "6379:6379"
    volumes:
     - "/home/deploy/v/redis:/data"
    restart: always

  memcached:
    image: memcached
    ports:
      - "11211:11211"
    restart: always

  db:
    image: postgres:9.4
    volumes:
      - "/home/deploy/v/pgdata:/var/lib/postgresql/data"
    restart: always

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Ваш docker-compose.yml файл говорит:

volumes:
 - /home/deploy/apps/myapp:/go/src/example.com/myapp

, что означает, что исходный каталог вашей хост-системы монтируется и скрывает все, что создает Dockerfile. ./myapp - это копия хоста исполняемого файла myapp, и если что-то не так (возможно, у вас есть хост MacOS или Windows), это вызовет эту ошибку.

Это популярная установка для интерпретируемых языков, где разработчики хотят запускать свое приложение без выполнения обычной последовательности тест-сборка-развертывание, но на самом деле не имеет смысла для скомпилированного языка, такого как Go, где у вас нет выбор. Я бы полностью удалил этот блок.

0 голосов
/ 29 октября 2018

Контейнер Go перестает работать из-за этого:

WORKDIR $GOPATH/src/example.com/myapp
RUN go build

#EXPOSE 80

#ENTRYPOINT $GOPATH/src/example.com/myapp/myapp
ENTRYPOINT ./myapp

Вы переключаете каталоги на $ GOPATH / src / example.com / myapp , где вы создаете свое приложение, однако точка входа указывает на неправильное местоположение.

Для решения этой проблемы вы либо копируете приложение в корневой каталог и сохраняете ту же команду ENTRYPOINT , либо копируете приложение в другое место и передаете полный путь, например:

ENTRYPOINT /my/go/app/location
...