我所拥有的是多个相似和简单的dockerfile
但是我想要的是有一个单基dockerfile,我的dockerfile将它们的变量传递给它。
在我的例子中,dockerfile之间唯一的区别仅仅是它们的EXPOSE,所以我认为最好保持基本dockerfile和其他dockerfile只像模板引擎那样将这些变量注入基本dockerfile
一个样本dockerfile
FROM golang:1.17 AS builder
WORKDIR /app
COPY . .
RUN go mod download
RUN go build -o /bin/app ./cmd/root.go
FROM alpine:latest
WORKDIR /bin/
COPY --from=builder /bin/app .
EXPOSE 8080
LABEL org.opencontainers.image.source="https://github.com/mohammadne/bookman-auth"
ENTRYPOINT ["/bin/app"]
CMD ["server", "--env=dev"]发布于 2021-09-19 04:50:50
正如yasen所说,不可能有进口指令。
最后,我所做的如下:指向github存储库的链接
EXPOSE ${{ EXPOSED_PORT }}创建模板文本文件FROM golang:1.17 AS builder
WORKDIR /app
COPY . .
RUN go mod download && make ent-generate
RUN go build -o /bin/app ./cmd/root.go
FROM alpine:latest
WORKDIR /bin/
COPY --from=builder /bin/app .
EXPOSE ${{ EXPOSED_PORT }}
LABEL org.opencontainers.image.source="https://github.com/mohammadne/bookman-library"
ENTRYPOINT ["/bin/app"]
CMD ["server", "--env=dev"]#!/usr/bin/python
from shutil import copyfile
import os
class Config:
def __init__(self, service, port):
self.service = service
self.port = port
configs = [
Config("auth", "8080"),
Config("user", "8081"),
Config("library", "8082"),
]
pathToDir = "../build"
template = f"{pathToDir}/template.txt"
for config in configs:
outputDir = f"{pathToDir}/{config.service}"
os.mkdir(outputDir)
fileName = copyfile(template, f"{outputDir}/Dockerfile")
with open(fileName, "rt") as file:
replacedText = file.read().replace('${{ EXPOSED_PORT }}', config.port)
with open(fileName, "wt") as file:
file.write(replacedText)然后在python脚本中您可以替换您的模式!
发布于 2021-09-18 14:20:31
IMPORT指令永远不会实现
很久以前,有人提出了IMPORT的Docker指令。
不幸的是,在公共关系尚未解决的情况下,问题仍未解决:
你的案子的解决办法
但就你的情况而言,你所需要的只是一点sed
例如:
# Case1: inplace templating
EXPOSED_PORT=8081 sed -i "s/EXPOSE 8080/EXPOSE $EXPOSED_PORT/" Dockerfile
# Case2: generating Dockerfile from template
sed "s/EXPOSE 8080/EXPOSE $EXPOSED_PORT/" Dockerfile.template > Dockerfile解释:
EXPOSED_PORT=8081声明本地bash变量sed是一种文本操作工具。sed -i "s/EXPOSE 8080/EXPOSE $EXPOSED_PORT/" Dockerfile将EXPOSE 8080替换为EXPOSE 8081sed "s/EXPOSE 8080/EXPOSE $EXPOSED_PORT/" Dockerfile.template > Dockerfile从Dockerfile.template生成新的Dockerfile发布于 2021-09-18 16:29:18
您可以将公开的端口作为映像的构建参数。如果你做了一个像这样的文件
FROM alpine:latest
ARG EXPOSED_PORT
EXPOSE ${EXPOSED_PORT}通过传递端口号,可以指定生成时公开的端口,如下所示
docker build -t myimage --build-arg EXPOSED_PORT=8000 .值得注意的是,公开语句主要是文档。您的图像将在不使用image语句的情况下正常工作。
https://stackoverflow.com/questions/69234878
复制相似问题