从基于前一阶段的 go 图像复制 go 包?
Copy go package from previous stage based go image?
在基于图像的 Python 中,我想 运行 使用 go package gnostic 的一个命令 (*):
RUN gnostic --grpc-out=test test/openapi/loyalty-bff.yaml
我确实写了以下 dockerfile:
FROM golang:1.17 AS golang
RUN go get -u github.com/google/gnostic@latest
RUN go get -u github.com/googleapis/gnostic-grpc@latest
FROM python:3.7.10
WORKDIR /app
ADD requirements.txt /app/
RUN pip install -r requirements.txt
ADD . /app/
COPY --from=golang /go/bin/gnostic /go/bin/gnostic-grpc
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "5000"]
我在 运行 命令 (*):
时出错
Command 'gnostic --grpc-out=loyalty-bff-1634180849463365375 loyalty-bff-1634180849463365375/loyalty-bff.yaml' returned non-zero exit status 127.
另一方面,我可以 运行 在不使用多级时。替换为 install python in image based go,但是构建时间很长:
FROM golang:1.17
WORKDIR /app
RUN go get -u github.com/google/gnostic@latest
RUN go get -u github.com/googleapis/gnostic-grpc@latest
RUN apt-get update
RUN apt-get install -y build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libsqlite3-dev libreadline-dev libffi-dev wget libbz2-dev
RUN wget https://www.python.org/ftp/python/3.7.8/Python-3.7.8.tgz
RUN tar -xf Python-3.7.8.tgz
RUN cd Python-3.7.8 \
&& ./configure --enable-shared \
&& make && make install
RUN apt-get install python3-pip -y
ADD requirements.txt /app/
RUN pip3 install -r requirements.txt
ADD . /app/
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "5000"]
退出代码127
通常意味着找不到可执行文件。
如果您查看 golang:1.17
的环境,您可以默认看到 PATH
有 /go/bin
:
$ docker run --rm -it golang:1.17 env
PATH=/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=a9b7efb588ea
TERM=xterm
GOLANG_VERSION=1.17.2
GOPATH=/go
HOME=/root
这就是为什么您可以在基于 golang 的容器中找到 gnostic
的原因。
但是,在 python:3.7.10
中,接下来是:
$ docker run --rm -it python:3.7.10 env
PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
因此,对于您的情况,将副本更改为下一个可以使其工作:
COPY --from=golang /go/bin/gnostic /go/bin/gnostic-grpc /usr/local/bin/
在基于图像的 Python 中,我想 运行 使用 go package gnostic 的一个命令 (*):
RUN gnostic --grpc-out=test test/openapi/loyalty-bff.yaml
我确实写了以下 dockerfile:
FROM golang:1.17 AS golang
RUN go get -u github.com/google/gnostic@latest
RUN go get -u github.com/googleapis/gnostic-grpc@latest
FROM python:3.7.10
WORKDIR /app
ADD requirements.txt /app/
RUN pip install -r requirements.txt
ADD . /app/
COPY --from=golang /go/bin/gnostic /go/bin/gnostic-grpc
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "5000"]
我在 运行 命令 (*):
时出错Command 'gnostic --grpc-out=loyalty-bff-1634180849463365375 loyalty-bff-1634180849463365375/loyalty-bff.yaml' returned non-zero exit status 127.
另一方面,我可以 运行 在不使用多级时。替换为 install python in image based go,但是构建时间很长:
FROM golang:1.17
WORKDIR /app
RUN go get -u github.com/google/gnostic@latest
RUN go get -u github.com/googleapis/gnostic-grpc@latest
RUN apt-get update
RUN apt-get install -y build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libsqlite3-dev libreadline-dev libffi-dev wget libbz2-dev
RUN wget https://www.python.org/ftp/python/3.7.8/Python-3.7.8.tgz
RUN tar -xf Python-3.7.8.tgz
RUN cd Python-3.7.8 \
&& ./configure --enable-shared \
&& make && make install
RUN apt-get install python3-pip -y
ADD requirements.txt /app/
RUN pip3 install -r requirements.txt
ADD . /app/
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "5000"]
退出代码127
通常意味着找不到可执行文件。
如果您查看 golang:1.17
的环境,您可以默认看到 PATH
有 /go/bin
:
$ docker run --rm -it golang:1.17 env
PATH=/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=a9b7efb588ea
TERM=xterm
GOLANG_VERSION=1.17.2
GOPATH=/go
HOME=/root
这就是为什么您可以在基于 golang 的容器中找到 gnostic
的原因。
但是,在 python:3.7.10
中,接下来是:
$ docker run --rm -it python:3.7.10 env
PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
因此,对于您的情况,将副本更改为下一个可以使其工作:
COPY --from=golang /go/bin/gnostic /go/bin/gnostic-grpc /usr/local/bin/