我正在使用docker多级构建,并试图为我的dockerized go应用程序添加实时重新加载功能。我有一个entrypoint。sh在第二个映像中有自己的配置。
现在,问题是来自第一个映像的命令CMD ["air", "-c", ".air.toml"]
被来自第二个映像的ENTRYPOINT ["/entrypoint.sh"]
脚本覆盖,因此只有ENTRYPOINT
启动而CMD
没有运行。
我不能像这样把它们组合成唯一的命令
ENTRYPOINT ["/entrypoint.sh", "air", "-c", ".air.toml"]
,因为第二个镜像没有安装相应库的Golang语言。
是否有可能以某种方式运行CMD
和ENTRYPOINT
并排?谢谢你。
Dockerfile
FROM golang:1.17.2
COPY . /go/src/sample
WORKDIR /go/src/sample
RUN go install github.com/go-delve/delve/cmd/dlv@latest
RUN go install github.com/cosmtrek/air@latest
CMD ["air", "-c", ".air.toml"]
FROM eclipse-temurin:17-focal
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
docker-compose.yml
version: '3'
services:
go:
build:
context: ./backend
dockerfile: Dockerfile
volumes:
- ./backend:/go/src/backend
working_dir: /go/src/backend
ports:
- 8080:8080
读取传递给入口点(即CMD)的参数
例如,下面是您的入口点脚本。你可以访问参数并对它们做一些事情,例如执行它们。#!/bin/bash
# dome something in your entrypoint
# execute the original command
# substituting the current process id
# so that command is run with pid 1
exec "$@"
在您的docker映像中,确保您有所需的命令,即
ENTRYPOINT ["/entryppoint.sh"]
CMD ["echo", "command"]
除了这个技术方面,您似乎暗示您想要运行依赖于go可用而不go可用的CMD。这不可能。你需要确保你要执行的事情和它的依赖是可用的。
您可以从第一阶段复制air二进制文件。像这样。
COPY --from=0 /go/bin/air /usr/local/bin/air
可能,您想用CGO_ENABLED=0
编译air
。
然而,我假设你需要go编译器在你的图像中存在任何热加载工作,因为你的应用程序需要在代码更改时重新编译。所以也许你甚至不应该在这里使用多阶段。
,说。在容器中进行热重载看起来有点像反模式。容器通常是分发工件的一种方法。