使用docker容器时找不到命令

使用docker容器时找不到命令

我使用 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...

运行whoamigroupsecho $PATH(当然是单独运行)。

如果二进制文件不在PATH变量中,那么很明显为什么找不到它们。

您需要安装工具才能将它们放入容器中(如果这是您想要的)。ADD并且COPY可以工作,但您需要确保安装一切需要。如果您需要特定工具并使用构建映像,Dockerfile那么一个选项就是将它们安装到那里的映像中。您还可以USER在中设置参数Dockerfile,还可以安装卷。

答案2

您可能应该有一个用于登录的图像,而不是容器 - 在使用之间可能没有理由将容器闲置。也许这就是您的意思。

您问了两个问题,其中一个是关于提示(由$PS1bash 中的环境变量控制),另一个是关于路径($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标志的重要性,否则你的下一个问题将是关于你的所有磁盘空间都去哪儿了。

相关内容