[英]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.