近两天来我一直在为这个问题绞尽脑汁。
我是 Docker 和 Docker Compose 的新手,正在尝试在运行 Postgres 和 Go 的 EC2 实例上运行我的图像。当我运行 docker-compose up 时,db
服务运行成功,但 app
服务运行失败。
当我尝试使用以下方法单独运行服务时:
docker-compose up db
一切正常
然后运行:
docker-compose up app
我得到...
app_1 | wait-for-it.sh: waiting 15 seconds for db:5432
app_1 | wait-for-it.sh: db:5432 is available after 0 seconds
app_1 | ./wait-for-it.sh: line 174: /go/src/github.com/MY_USERNAME/MY_APP_DIR/EXECUTABLE: No such file or directory
some_name-golang_app_1 exited with code 127
Dockerfile 备用:
FROM golang:latest
EXPOSE 8080
WORKDIR /go/src/github.com/MY_USERNAME/MY_APP_DIR
ADD . /go/src/github.com/MY_USERNAME/MY_APP_DIR
# Install all dependencies of the current project.
RUN go get -v
RUN go build
docker-compose.yml
version: '3'
services:
db:
image: postgres
environment:
POSTGRES_DB: dbname
POSTGRES_USER: miller
POSTGRES_PASSWORD: miller
ports:
- "6000:5432"
app:
build:
context: .
dockerfile: Dockerfile-alternate
command: ["./wait-for-it.sh", "db:5432", "--", "./EXECUTABLE"]
volumes:
- .:/go/src/github.com/gregpmillr/volume
ports:
- "80:8080"
depends_on:
- db
links:
- db
有趣的是,如果我运行 docker run -it --rm MY_USERNAME/custom-go-image
那么我确实看到了 EXECUTABLE
文件,并且可以运行 ./EXECUTABLE
成功...好吧,我没有收到这样的主机错误,但很确定那是因为我没有使用 docker-compose 同时启动它们。
对这个问题有什么想法吗?提示/资源会很棒。我一直在寻找谷歌搜索问题的兔子洞,却一无所获。这可能是我像往常一样遗漏的一些小东西。谢谢!!
我希望先运行 postgres(现在可以正常工作),然后运行连接到 postgres 的 go 服务器。
更新 1
命令:[ "sh", "-c", "cd/go/src/github.com/gregpmillr/volume && ls -l"]
将给出以下输出:
db_1 | 2018-08-19 11:19:48.828 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
db_1 | 2018-08-19 11:19:48.828 UTC [1] LOG: listening on IPv6 address "::", port 5432
db_1 | 2018-08-19 11:19:48.831 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
db_1 | 2018-08-19 11:19:48.857 UTC [21] LOG: database system was shut down at 2018-08-19 01:03:35 UTC
db_1 | 2018-08-19 11:19:48.880 UTC [1] LOG: database system is ready to accept connections
app_1 | total 36
app_1 | -rw-rw-r-- 1 1000 1000 238 Aug 19 11:19 Dockerfile-alternate
app_1 | -rw-rw-r-- 1 1000 1000 260 Aug 17 19:24 Dockerrun.aws.json
app_1 | -rw-rw-r-- 1 1000 1000 62 Aug 17 18:56 README.md
app_1 | drwxrwxr-x 8 1000 1000 4096 Aug 17 19:00 app
app_1 | drwxrwxr-x 2 1000 1000 4096 Aug 17 19:34 config
app_1 | -rwxrwxr-x 1 1000 1000 708 Aug 17 19:48 deploy.sh
app_1 | -rw-rw-r-- 1 1000 1000 548 Aug 19 11:19 docker-compose.yml
app_1 | -rw-rw-r-- 1 1000 1000 1188 Aug 17 19:00 main.go
app_1 | -rwxrwxr-x 1 1000 1000 4079 Aug 17 19:00 wait-for-it.sh
app_1 exited with code 0
Dockerrun 文件是不必要的,因为我没有使用 elastic beanstalk atm。
更新 2 解决了。查看接受的答案。更具体地,参见 https://docs.docker.com/storage/和 https://docs.docker.com/storage/volumes/有关卷的更多信息。感谢您的帮助!
最佳答案
您已将 go 源代码添加到您的图像中,并将其作为构建的一部分在图像中编译。然后,通过包含以下内容,用包含源代码(显然没有编译的二进制文件)的卷覆盖相同的路径:
volumes:
- .:/go/src/github.com/gregpmillr/Tranquility-Online-Golang
您要么需要该卷中的已编译二进制文件,要么跳过将卷安装到容器中,因为它会阻止对镜像中文件的访问。
关于postgresql - Postgres, Go Docker compose wait-for-it.sh 没有那个文件或目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51902742/