簡體   English   中英

在容器中找不到命令

[英]Command not found in container

在 docker 容器內,我運行了一個 python 腳本。 我的Dockerfile如下所示

FROM ubuntu:18.04

WORKDIR /ingestion
COPY /services/bcp /ingestion/services/bcp

RUN mkdir -p /tmp/ingestion && \
    chmod +x /ingestion/bcp-build.sh && \
    /ingestion/bcp-build.sh

ENTRYPOINT ["python3", "-m", "services.bcp"]

bcp-build.sh我為 linux 安裝了bcp工具:

apt-get update
apt-get upgrade -y
apt-get install -y curl

curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - 
curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list | tee /etc/apt/sources.list.d/msprod.list 

apt-get update
ACCEPT_EULA=Y apt-get install -y mssql-tools unixodbc-dev 
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
source ~/.bash_profile
source ~/.bashrc

要運行容器,我使用docker-compose.yml

version: "3"
services:
    bcp: 
        build: .

python(此處的示例代碼)如下所示:

import argparse

arg_parser: argparse = argparse. \
   ArgumentParser(
       description="Extract tables to CSV",
       usage="bcp.py [-h] [--database [str]]"
   )
required_args: argparse = arg_parser.add_argument_group("required arguments")
required_args.add_argument("--database", metavar="str", type=str, help="database from where to extract", required=True)

def foo():
   args: argparse = arg_parser.parse_args()
   database = args.database
   print(database)

   # build bcp cmd 
   cmd: str = f"bcp {database}.table out /tmp/ingestion/foo.csv"
   subprocess.run(cmd, shell=True) # execute it via subprocess

foo()

要創建映像並使用它,我運行以下命令docker-compose up -d --build -t foo 有用。 但是,當我嘗試執行python代碼時,它無法識別bcp命令。 它說找不到 bcp 命令 您能否指點一下,如何緩解這個問題?

確切的錯誤消息是"bcp command not found"

有趣的是,當我運行docker run -it --rm --entrypoint bash foo並執行bcp該命令可用。

當您在鏡像中安裝軟件時,您會嘗試在.bashrc設置備用路徑,但運行 Docker 鏡像的最常見路徑永遠不會讀取這些點文件。 ENTRYPOINT的 JSON 數組形式根本不涉及外殼,因此沒有任何東西會讀取您寫入.bashrc.bash_profile

source指令也沒有效果:您從腳本運行它,因此在bcp-build.sh腳本末尾設置“過期”的環境變量以及在任何情況下 Dockerfile RUN指令都不會注意到或保持環境的變化。

如果需要修改鏡像中的環境變量,則需要使用 Dockerfile ENV指令。 (唯一可以改變容器環境的是在容器啟動時運行的腳本。)

ENV PATH $PATH:/opt/mssql-tools/bin

一般來說,Debian 軟件包需要在普通的“系統”目錄中安裝它們的軟件,因此您可能會提交一個錯誤,表明該支持工具沒有像普通二進制文件那樣安裝到/usr/bin

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM