我所擁有的,是多個類似的和簡單的dockerfiles
但我想要的是有一個單一的基礎dockerfile和我的dockerfiles
將它們的變數傳入其中。
在我的案例中,只有一個變數被傳入。
在我的例子中,dockerfile之間的唯一區別是
僅僅是它們的EXPOSE,所以我認為最好保留一個基本的dockerfile,其他的dockerfile只將變數注入到基本的dockerfile中,就像一個模板引擎
一個例子dockerfile:
FROM golang:1.17 AS builder
/app
COPY . .
RUN go mod download
RUN go build -o /bin/app . /cmd/root.go
FROM alpine:latest
/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"]
uj5u.com熱心網友回復:
IMPORT指令將永遠不會被實施
。
很久以前,有人提議為Docker的IMPORT指令
不幸的是,問題已被關閉,而PR仍在開放中:
針對您的情況的解決方案
但是對于你的情況,你所需要的只是一點sed。
例如:
# Case1: inplace templating
EXPOSED_PORT=8081 sed -i "s/EXPOSE 8080/EXPOSE $EXPOSED_PORT/" Dockerfile
# Case2: generate 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 8081。
sed "s/EXPOSE 8080/EXPOSE $EXPOSED_PORT/" Dockerfile.template > Dockerfile從Dockerfile.template生成新的Dockerfile。
uj5u.com熱心網友回復:
你可以將暴露的埠作為鏡像的構建引數。如果你做一個像這樣的dockerfile
FROM alpine:latest
arg exposed_port
暴露 ${exposed_port}
你可以在構建時通過傳遞埠號來指定哪個埠被暴露出來,就像這樣
docker build -t myimage --build-arg EXPOSED_PORT=8000 .
值得注意的是,EXPOSE陳述句主要是檔案。你的影像在沒有EXPOSE陳述句的情況下也能正常作業。
uj5u.com熱心網友回復:
你有一個非常好的想法。 我有兩個想法:
- 創建一個基礎資料庫。
- 按照你的描述創建基本的dockerfile,然后像這樣構建它。
docker image build tag base。 然后你可以有兩個襯墊Docker檔案,看起來像FROM base EXPOSE 8080 - 另外,你可以有一個單一的Docker檔案,只是改變你運行容器的方式。 有一個
expose開關。 幾乎所有你在Dockerfile中指定的東西都可以在run命令中被覆寫。
uj5u.com熱心網友回復:
正如Yasen所說,不可能有匯入指令。
最后,我所做的是如下。鏈接到github資源庫
- 創建一個模板文本。
- 創建一個帶有
EXPOSE ${{ EXPOSED_PORT }}的模板文本檔案:
FROM golang:1.17 AS builder
WorkKDIR /app
復制 . .
RUN go mod download && make ent-generate
運行 go build -o /bin/app ./cmd/root.go
FROM alpine:最新
WORKDIR /bin/
COPY --from=builder /bin/app .
expose ${{ exposed_port }}.
LABEL org.opencontainers.image.source="https://github.com/mohammadne/bookman-library"/span>
ENTRYPOINT ["/bin/app"]
CMD ["server", "-env=dev"]
- 然后創建一個Python腳本 。
#!/usr/bin/python。
from shutil import copyfile
import os
class Config:
def __init__(self, service, port)。
self.service = service
self.port = port
configs = [
配置("auth", "8080")。
Config("user", "8081"),
配置("library", "8082")。
]
pathToDir = ".../build"/span>
模板 = f"{pathToDir}/template.txt"
for config in configs:
outputDir = f"{pathToDir}/{config.service}"
os.mkdir(outputDir)
fileName = copyfile(template, f"{outputDir}/Dockerfile"/span>)
with open(fileName, "rt") as file:
replacedText = file.read().replace('${{ EXPOSED_PORT }}', config.port)
with open(fileName, "wt") as file:
file.write( replacedText)
然后在python腳本中你可以替換你的模式!
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/329379.html
標籤:
