我正在使用an official image from Microsoft其中包含用于与 Microsoft SQL Servers
交互的 SQL 工具
。如果我以交互方式运行容器,我可以在命令行运行 sqlcmd
而不会出现任何问题,因为它位于 PATH 变量中:
$ docker run --rm -it -v $(pwd):/var/update/ -w /var/update mcr.microsoft.com/mssql-tools:latest
root@df20bd19b982:/var/update# sqlcmd
Microsoft (R) SQL Server Command Line Tool
Version 13.1.0007.0 Linux
Copyright (c) 2012 Microsoft. All rights reserved.
usage: sqlcmd [-U login id] [-P password]
[-S server or Dsn if -D is provided]
[-H hostname] [-E trusted connection]
[-N Encrypt Connection][-C Trust Server Certificate]
[-d use database name] [-l login timeout] [-t query timeout]
[-h headers] [-s colseparator] [-w screen width]
[-a packetsize] [-e echo input] [-I Enable Quoted Identifiers]
[-c cmdend]
[-q "cmdline query"] [-Q "cmdline query" and exit]
[-m errorlevel] [-V severitylevel] [-W remove trailing spaces]
[-u unicode output] [-r[0|1] msgs to stderr]
[-i inputfile] [-o outputfile]
[-k[1|2] remove[replace] control characters]
[-y variable length type display width]
[-Y fixed length type display width]
[-p[1] print statistics[colon format]]
[-R use client regional setting]
[-K application intent]
[-M multisubnet failover]
[-b On error batch abort]
[-D Dsn flag, indicate -S is Dsn]
[-X[1] disable commands, startup script, environment variables [and exit]]
[-x disable variable substitution]
[-? show syntax summary]
root@b33a916d4230:/var/update# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/mssql-tools/bin
root@b33a916d4230:/var/update#
sqlcmd
is present in/opt/mssql-tools/bin/
folder which is part of the PATH env. variable.
但是如果我尝试在docker run...bash -c 'sqlcmd'
执行sqlcmd
命令,它不会找到它。我在同一命令行中回显 PATH 环境变量,发现其路径即 /opt/mssql-tools/bin
已在 PATH 中。
$ docker run --rm -it -v $(pwd):/var/update/ -w /var/update mcr.microsoft.com/mssql-tools:latest bash -c "sqlcmd"
bash: sqlcmd: command not found
并查看PATH
环境。变量,我做了以下操作:
$docker run --rm -it -v $(pwd):/var/update/ -w /var/update mcr.microsoft.com/mssql-tools:latest bash -c 'echo $PATH'
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
问题 1:如果我们使用 bash -c 'commands'
,为什么路径变量会不同?
问题2:如果bash -c
或sh -c
创建了一个新的shell,如何使用容器的环境变量(尤其是PATH
环境变量。
最佳答案
当您以 root
身份运行交互式 shell 时,它会运行 /root/.bashrc
中的命令,其中(在此特定图像中)包括
export PATH="$PATH:/opt/mssql-tools/bin"
更好的 Docker 镜像会在 Dockerfile 本身中包含该设置,从而将其导出到镜像的所有用户。您可以轻松地自己构建这样的图像。
FROM mcr.microsoft.com/mssql-tools:latest
ENV PATH="$PATH:/opt/mssql-tools/bin"
(此外,export
是多余的;该变量已由 shell 导出。)
如果您不想弄乱图像,请尝试
docker run --rm -it -v $(pwd):/var/update/ -w /var/update \
mcr.microsoft.com/mssql-tools:latest \
bash -c 'PATH=$PATH:/opt/mssql/bin sqlcmd'
关于bash - Docker Run执行shell命令无法访问PATH环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75005317/