permission denied в docker
Создал простой Dockerfile:
FROM golang
EXPOSE 8080 80 443
# Set pwd to the go folder
WORKDIR ${GOPATH}
RUN apt-get update -y && \
apt-get install -y \
nano
RUN go get github.com/gorilla/mux && go get github.com/go-sql-driver/mysql
COPY ${PROJECT_PATH} /go/cms
RUN cd /go/cms && go build && chmod +x cms
EXPOSE 8080
CMD ["./cms"]
но получаю ошибку
ERROR: for b5ceea118913_cms_web_1 Cannot start service web: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: \"./cms\": permission denied": unknown
ERROR: for web Cannot start service web: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: \"./cms\": permission denied": unknown
Чего тут не хватает?
docker run -it cms_web sh -c "pwd && ls -al"
показывает:
total 10828
drwxr-xr-x 1 root root 4096 Feb 28 09:04 .
drwxrwxrwx 1 root root 4096 Feb 28 09:04 ..
-rw-rw-r-- 1 root root 35 Feb 26 16:24 .env
-rw-rw-r-- 1 root root 13 Feb 26 16:24 .env.example
drwxrwxrwx 8 root root 4096 Feb 28 08:06 .git
-rwxrwxrwx 1 root root 32 Feb 27 08:20 .gitignore
drwxrwxrwx 3 root root 4096 Feb 28 09:03 .idea
-rwxrwxrwx 1 root root 166 Feb 26 15:56 Database
-rwxrwxrwx 1 root root 330 Feb 28 09:03 Dockerfile
drwxrwxrwx 7 root root 4096 Feb 27 15:04 _local_mysql_data
drwxrwxrwx 6 root root 4096 Feb 26 12:52 app
-rwsrws--T 1 root root 11025893 Feb 28 09:04 cms
-rwxrwxrwx 1 root root 940 Feb 27 08:38 docker-compose.yml
-rw-rw-r-- 1 root root 384 Feb 26 16:29 main.go
drwxrwxrwx 2 root root 4096 Feb 28 08:13 migrations
drwxrwxrwx 3 root root 4096 Feb 20 08:26 templates
Ответы (2 шт):
у вас WORKDIR стоит ${GOPATH}, не смотря на то, что потом делаете cd /go/cms, в конце все равно WORKDIR будет ${GOPATH}(в данном случае это просто /go)
поэтому, вам надо либо указывать полный путь до исполняемого файла CMD ["/go/cms/cms"], либо менять рабочую директорию
WORKDIR /go/cms
CMD ["./cms"]
UPDATE для ответа комментария
имеем main.go
package main
import "fmt"
func main() {
fmt.Println("hello world")
}
docker.env
PROJECT_PATH=.
Dockerfile
FROM golang
# Set pwd to the go folder
WORKDIR ${GOPATH}
RUN go get github.com/gorilla/mux && go get github.com/go-sql-driver/mysql
COPY ${PROJECT_PATH} /go/cms
RUN cd /go/cms \
&& go build \
&& chmod +x cms \
&& ls -al
WORKDIR /go/cms
CMD ["./cms"]
билдим
docker build -t test -f Dockerfile .
исполняем
➜ docker run -it test
hello world
из Dockerfile удаляем WORKDIR /go/cms, билдим, исполняем и получаем
docker: Error response from daemon: OCI runtime create failed: container_linux.go:346: starting container process caused "exec: \"./cms\": permission denied": unknown.
потому что нет исполняемого файла. как убедиться?
docker run -it test sh -c "pwd && ls -al "
/go
total 24
drwxrwxrwx 1 root root 4096 Feb 28 09:25 .
drwxr-xr-x 1 root root 4096 Feb 28 09:27 ..
drwxrwxrwx 2 root root 4096 Feb 27 03:48 bin
drwxr-xr-x 1 root root 4096 Feb 28 09:25 cms
drwxr-xr-x 3 root root 4096 Feb 28 09:25 pkg
drwxrwxrwx 1 root root 4096 Feb 28 09:25 src
Ч.т.д.
Ошибка возникает при запуске контейнера, потому что внутри него нет прав на запуск файла ./cms. Это происходит потому, что в Dockerfile необходимо изменить права на файл cms командой chmod, чтобы его можно было запустить внутри контейнера.
Вот что нужно добавить в Dockerfile перед запуском файла ./cms:
RUN chmod +x /go/cms/cms
Эта команда изменит права на файл cms и позволит запустить его внутри контейнера.
Полный Dockerfile должен выглядеть так:
FROM golang
EXPOSE 8080 80 443
# Set pwd to the go folder
WORKDIR ${GOPATH}
RUN apt-get update -y && \
apt-get install -y \
nano
RUN go get github.com/gorilla/mux && go get github.com/go-sql-driver/mysql
COPY ${PROJECT_PATH} /go/cms
RUN cd /go/cms && go build && chmod +x cms && \
chmod +x /go/cms/cms
EXPOSE 8080
CMD ["./cms"]