【发布时间】:2023-01-27 00:59:13
【问题描述】:
我正在尝试构建此 dockerfile 然后运行它,但出现此错误 docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "./deployment-service": permission denied: unknown.
这是我的 docker 文件,我已经创建了卷和网络
FROM golang:1.19.2-alpine as builder
RUN apk add bash
RUN apk add --no-cache openssh-client ansible git
RUN mkdir /workspace
WORKDIR /workspace
COPY go.mod ./
COPY go.sum ./
RUN go mod download
COPY . ./
RUN go build -o deployment-service cmd/deployment-service/main.go
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /workspace .
ARG DEFAULT_PORT=8080
ENV PORT $DEFAULT_PORT
EXPOSE $PORT
CMD ["./deployment-service"]
这是我的运行命令,
docker run --name=${CONTAINER_NAME} -d --rm -p ${PORT}:80 -e DEPLOYMENT_SERVICE_DATABASE_CONNECTION_URI=mongodb://${MONGO_USERNAME}:${MONGO_PASSWORD}@${MONGO_CONTAINER_NAME}:27017/ -e DEPLOYMENT_SERVICE_SERVER_SECRET_KEY=${SECRET_KEY} -e ANSIBLE_CONFIG='./jam-ansible/ansible.cfg' -e DEPLOYMENT_SERVICE_ANSIBLE_SUBMISSION_ROOT=${DEPLOYMENT_ROOT} -v ${DEPLOYMENT_VOLUME}:${DEPLOYMENT_ROOT} --network=${NETWORK_NAME} server:latest
帮助解决我的问题。
【问题讨论】:
-
在没有 Docker 的情况下,相同的
go build ...; ./deployment-service序列是否有效?go build ... ./cmd/deployment-service,指定包名而不仅仅是单个文件名是否更好? -
是的,它的工作。在我开始面临这个问题之后,我错误地从容器中删除了二进制文件一次。
-
...在
docker run命令中,您有一个-v选项隐藏容器中的$DEPLOYMENT_ROOT目录。如果是图片的/root目录,肯定会出现这个问题;删除该选项以使用图像中内置的二进制文件。 (docker building 一个更新的图像不应该比go building 一个二进制文件贵很多;你不需要卷挂载来注入代码。) -
不,那不是图像的根目录,它是我想保留的容器中的一些数据。此外,当我将二进制名称更改为其他名称时,我解决了错误消息。正如我之前所说,问题是在我删除容器内的二进制文件后开始的,但据我所知,如果一个容器被删除,与其相关的所有内容都会被删除,所以如果我在删除容器(我从中删除了二进制文件)后创建一个新容器) 它应该再次生成二进制文件并且应该可以正常工作,但它没有发生。