我正在尝试运行
docker compose up -d --build
一个现有的成功构建的项目(由docker-compose build
),即DeathStarBench,它是一个用于运行多个微服务以相互交互的系统(可以在这个Github存储库中找到)。
以下代码显示了 Dockerfile 的内容:
FROM golang:1.21 as builder
WORKDIR /workspace
COPY go.sum go.sum
COPY go.mod go.mod
COPY vendor/ vendor/
COPY cmd/ cmd/
COPY dialer/ dialer/
COPY registry/ registry/
COPY services/ services/
COPY tls/ tls/
COPY tracing/ tracing/
COPY tune/ tune/
COPY config.json config.json
RUN CGO_ENABLED=0 GOOS=linux GO111MODULE=on go install -ldflags="-s -w" -mod=vendor ./cmd/...
此外,在
docker-compose.yaml
中,对于此存储库中的每个微服务,都有一条记录来确定其入口点以及一条记录来确定其相应的卷。例如,对于recommendation
微服务,我们在docker-compose.yaml
文件中有以下记录:
# <other services configuration>
recommendation:
configs:
- source: server_config
target: /config.json
environment:
- TLS
- GC
- JAEGER_SAMPLE_RATIO
- LOG_LEVEL
build: .
image: deathstarbench/hotel-reservation:latest
entrypoint: ./cmd/recommendation
depends_on:
- mongodb-recommendation
- consul
restart: always
deploy:
replicas: 1
restart_policy:
condition: any
# ...
volumes:
# ...
recommendation:
# ...
configs:
server_config:
file: ./config.json
对于
cmd
文件夹中列出的每个服务,yaml 文件中的入口点已设置为:entrypoint: ./cmd/<name of the service>
,例如,对于 recommendation
服务,它是 entrypoint: ./cmd/recommendation
。看来这里的切入点是正确的。
运行平台是
Ubuntu 22.04
和Docker version 26.1.1, build 4cf5afa
。
请注意,服务均在 Golang 中。
运行
docker compose up -d --build
时出现以下错误:
Error response from daemon: failed to create task for container:
failed to create shim task: OCI runtime create failed:
runc create failed: unable to start container process:
exec: "./cmd/recommendation": is a directory: unknown: permission denied
每次失败的服务的名称都可以更改(这里是
recommendation
微服务)。
为了解决该问题,我尝试了以下方法,但是完全得到相同的错误。
./cmd
中的所有服务授予完全权限(来自 Stackoverflow 中的这篇文章)如以下更改:
# <remaining code in Dockerfile>
USER root
RUN chmod -R 777 ./cmd/*
RUN CGO_ENABLED=0 GOOS=linux GO111MODULE=on go install -ldflags="-s -w" -mod=vendor ./cmd/...
RUN chmod -R 777 ./cmd/*
也许部分更改就足够了,但整套更改并不成功,包括
USER root
或在RUN
命令之前和之后更改权限(按理说应该是在COPY之后)。
sudo
运行命令:应用试验 #1 中提到的更改后,使用
docker compose up
命令运行 sudo
。然而,同样的问题也存在。
将当前用户添加到docker组后,我再次遇到相同的错误(我也在将用户添加到组后重新启动了系统)。
在运行
docker compose up
之前使用以下命令更改 docker 套接字的权限:
sudo chmod 666 /var/run/docker.sock
现在的问题是如何解决这个问题。运行试验有什么问题吗?
该错误看起来不像您的
entrypoint
字段,该字段应该是容器作为主进程应该运行的内容!
exec: "./cmd/recommendation": is a directory: unknown: permission denied
这是否提供更多信息?
docker compose run recommendation ls -lhaF cmd