Учитывая двоичный код, скомпилированный с помощью Go с использованием GOOS=linux
и GOARCH=amd64
, развернутый в контейнер docker
на основе alpine:3.3
, двоичный файл не будет запущен, если хост-сервер докеры - Ubuntu (15.10):
sh: /bin/artisan: not found
Этот же двоичный файл (скомпилированный для той же ОС и арки) будет работать просто отлично, если хост хоста docker busybox
(который является базой для alpine
), развернутый в виртуальной виртуальной машине VM на Mac OS X.
Этот же двоичный файл также будет работать отлично, если контейнер основан на одном из изображений Ubuntu.
Любая идея, что этот бинарный файл отсутствует?
Это то, что я сделал для воспроизведения (успешный запуск в VirtualBox/busybox в OS X не показан):
Сборка (создание явно с флагами, даже если совпадение арки):
➜ artisan git:(master) ✗ GOOS=linux GOARCH=amd64 go build
Проверьте, может ли он выполняться на хосте:
➜ artisan git:(master) ✗ ./artisan
10:14:04.925 [ERROR] artisan: need a command, one of server, provision or build
Скопировать в docker dock, выполнить, запустить:
➜ artisan git:(master) ✗ cp artisan docker/build/bin/
➜ artisan git:(master) ✗ cd docker
➜ docker git:(master) ✗ cat Dockerfile
FROM docker:1.10
COPY build/ /
➜ docker git:(master) ✗ docker build -t artisan .
Sending build context to Docker daemon 10.15 MB
Step 1 : FROM docker:1.10
...
➜ docker git:(master) ✗ docker run -it artisan sh
/ # /bin/artisan
sh: /bin/artisan: not found
Теперь изменим базу изображений на phusion/baseimage
:
➜ docker git:(master) ✗ cat Dockerfile
#FROM docker:1.10
FROM phusion/baseimage
COPY build/ /
➜ docker git:(master) ✗ docker build -t artisan .
Sending build context to Docker daemon 10.15 MB
Step 1 : FROM phusion/baseimage
...
➜ docker git:(master) ✗ docker run -it artisan sh
# /bin/artisan
08:16:39.424 [ERROR] artisan: need a command, one of server, provision or build