所以我剛剛創建了我的第一個 docker 映像(woohoo),并且能夠在創建它的原始主機系統(Ubuntu 20.04 Desktop PC)上運行它。該影像是使用docker run -it <image_id>. 運行了預期的命令(定義在CMD其中只是一個 bash 腳本),并且看到了預期的輸出。我認為這意味著我成功創建了我的第一個 docker 鏡像,因此我將其推送到 Docker Hub。
碼頭工人中心
帶有原始docker-compose.yml和Dockerfile
這是 Dockerfile:
FROM ubuntu:20.04
# Required for Debian interaction
# (https://stackoverflow.com/questions/62299928/r-installation-in-docker-gets-stuck-in-geographic-area)
ENV DEBIAN_FRONTEND noninteractive
WORKDIR /home/benchmarking-programming-languages
# Install pre-requisites
# Versions at time of writing:
# gcc -- version (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
# make -- GNU Make 4.2.1
# curl -- 7.68.0
RUN apt update && apt install make build-essential curl wget tar -y
# Install `column`
RUN wget https://mirrors.edge.kernel.org/pub/linux/utils/util-linux/v2.35/util-linux-2.35-rc1.tar.gz
RUN tar xfz util-linux-2.35-rc1.tar.gz
WORKDIR /home/benchmarking-programming-languages/util-linux-2.35-rc1
RUN ./configure
RUN make column
RUN cp .libs/column /bin/
WORKDIR /home/benchmarking-programming-languages
RUN rm -rf util-linux-2.35-rc1*
RUN apt install python3 pip -y
RUN ln -s /usr/bin/python3 /usr/bin/python
RUN apt install default-jdk-headless -y
RUN apt install rustc -y
# Install GoLang
RUN wget https://go.dev/dl/go1.17.8.linux-amd64.tar.gz
RUN rm -rf /usr/local/go && tar -C /usr/local -xzf go1.17.8.linux-amd64.tar.gz
ENV PATH="/usr/local/go/bin:${PATH}"
# Install Haxe and Haxelib
RUN wget https://github.com/HaxeFoundation/haxe/releases/download/4.2.5/haxe-4.2.5-linux64.tar.gz
RUN tar xfz haxe-4.2.5-linux64.tar.gz
RUN ln -s /home/benchmarking-programming-languages/haxe_20220306074705_e5eec31/haxe /usr/bin/haxe
RUN ln -s /home/benchmarking-programming-languages/haxe_20220306074705_e5eec31/haxelib /usr/bin/haxelib
# # Install Neko (Haxe VM)
# RUN add-apt-repository ppa:haxe/snapshots -y
# RUN apt update
# RUN apt install neko -y
RUN if ! test -d /home/benchmarking-programming-languages; then mkdir /home/benchmarking-programming-languages && echo "Created directory /home/benchmarking-programming-languages."; fi
COPY . /home/benchmarking-programming-languages
RUN pip install -r /home/benchmarking-programming-languages/requirements_dev.txt
CMD [ "/home/benchmarking-programming-languages/benchmark.sh -v" ]
但是,在我的 Windows 10 機器(與上述相同的機器,只是雙啟動的機器)和 Windows 11 筆記本電腦上同時使用 Docker 桌面應用程式和命令列(docker pull mariosyian/benchmarking-programming-languages后跟docker run -it <image_id>)提取相同的影像時。兩者都給我以下錯誤
Error invoking remote method 'docker-run-container': Error: (HTTP code 400) unexpected - failed to create shim: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "/home/benchmarking-programming-languages/benchmark.sh -v": stat /home/benchmarking-programming-languages/benchmark.sh -v: no such file or directory: unknown
盡管如此,將影像作為帶有 shell ( docker run -it <image_id> sh) 的容器運行,我不僅能夠成功地看到檔案,而且能夠毫無錯誤地執行它!有人可以提出錯誤首先發生的原因,以及如何解決它?
uj5u.com熱心網友回復:
在您Dockerfile指定的CMDas
CMD [ "/home/benchmarking-programming-languages/benchmark.sh -v" ]
這使用指令的JSON 語法CMD,即是一個字串陣列,其中第一個字串是可執行檔案,后面的每個字串都是該可執行檔案的引數。
由于您只指定了一個字串docker,因此嘗試呼叫可執行檔案/home/benchmarking-programming-languages/benchmark.sh -v- 即一個名為“ ”的檔案benchmark.sh -v,其名稱中包含一個空格并以-v. 但是您實際上打算做的是使用引數benchmark.sh呼叫腳本。-v
您可以通過將引數正確指定為單獨的字串來做到這一點:
CMD ["/home/benchmarking-programming-languages/benchmark.sh", "-v"]
或使用shell 語法:
CMD /home/benchmarking-programming-languages/benchmark.sh -v
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/444061.html
標籤:重击 码头工人 码头工人撰写 dockerfile 虚拟化
