我使用 gitlab ci 中的 docker 容器通过 ssh 登录服务器。当我通过计算机登录服务器时,是否可以运行php70
或/usr/bin/php71
没有错误。左侧还有典型的 user@pc:path。
当我在 docker 容器中使用 ssh 客户端并登录到服务器时,只有“$”,没有 user@pc:path,并且找不到php70
或之类的命令/usr/bin/php71
。我的第一个想法是,我使用不同的 shell,但 echo $SHELL 都在两者中/bin/bash
。我的 gitlab-ci.yml 代码如下:
image: ruby:2.1
stage: on_server
environment: production
before_script:
# install ssh-agent
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
# run ssh-agent
- eval $(ssh-agent -s)
# add ssh key stored in SSH_PRIVATE_KEY variable to the agent store
- ssh-add <(echo "$SSH_KEY_PRIVATE")
# disable host key checking (NOTE: makes you susceptible to man-in-the-middle attacks)
# WARNING: use only in docker container, if you use it with shell you will overwrite your user's ssh config
- mkdir -p ~/.ssh
- echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config
script:
- ssh $SSH_USER_PRODUCTION@$FTP_HOST_PRODUCTION "bash -l"
- bash
- echo $SHELL
- echo $PATH
- SYMFONY_ENV=prod php71 composer.phar install --no-dev --optimize-autoloader --ignore-platform-reqs
- SYMFONY_ENV=prod php71 app/console doctrine:migrations:migrate
- SYMFONY_ENV=prod php71 app/console cache:clear --env=prod
有人知道这种行为从何而来吗?
答案1
您是否ssh
像通常一样以同一个用户身份登录?
你ssh
是否正在进入相同的您的机器或者远程机器?
你运行的是什么操作系统?假设是 *Nix...
运行whoami
,groups
和echo $PATH
(当然是单独运行)。
如果二进制文件不在PATH
变量中,那么很明显为什么找不到它们。
您需要安装工具才能将它们放入容器中(如果这是您想要的)。ADD
并且COPY
可以工作,但您需要确保安装一切需要。如果您需要特定工具并使用构建映像,Dockerfile
那么一个选项就是将它们安装到那里的映像中。您还可以USER
在中设置参数Dockerfile
,还可以安装卷。
答案2
您可能应该有一个用于登录的图像,而不是容器 - 在使用之间可能没有理由将容器闲置。也许这就是您的意思。
您问了两个问题,其中一个是关于提示(由$PS1
bash 中的环境变量控制),另一个是关于路径($PATH
环境变量)。
这两个问题之所以相关,是因为通常都是由 bash 使用的启动脚本设置的。摘自 bash 手册:
When bash is invoked as an interactive login shell, or as a non-inter‐
active shell with the --login option, it first reads and executes com‐
mands from the file /etc/profile, if that file exists. After reading
that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile,
in that order, and reads and executes commands from the first one that
exists and is readable. The --noprofile option may be used when the
shell is started to inhibit this behavior.
运行 docker 时,可以使用-i
参数获取交互式会话。我猜想,这可能就是让容器按预期运行所需要做的全部工作,但也可能需要复制适当的配置文件或 bashrc 文件。
大多数 docker 的交互式调用都希望像这样运行docker run -it --rm repo/image:version ...
。仔细考虑一下每个标志,特别是--rm
标志的重要性,否则你的下一个问题将是关于你的所有磁盘空间都去哪儿了。