如何在不使用 -it 的情况下触发 docker 运行 命令时 运行 bash?

How to run the bash when we trigger docker run command without -it?

我有一个 Dockerfile 如下:

FROM centos
RUN mkdir work
RUN yum install -y python3 java-1.8.0-openjdk java-1.8.0-openjdk-devel tar git wget zip
RUN pip install pandas
RUN pip install boto3
RUN pip install pynt
WORKDIR ./work
CMD ["bash"]

我正在安装一些基本的依赖项。 现在当我 运行

docker run imagename

除了我 运行

它什么都不做

docker run -it imageName

我登陆 bash shell。但是我想在触发 运行 命令后立即进入 bash shell,无需任何额外参数。

我在 AWS codebuild 中使用这个 docker 容器,在那里我不能指定任何参数,比如 -it 但我想在 docker 容器本身中执行我的代码。 是否可以修改 CMD/ENTRYPOINT,使 运行 处理 docker 图像时,我正好落在容器内?

我检查了您的容器,由于缺少 pip,它甚至无法构建。所以我稍微修改了一下,让它至少可以构建:

FROM centos
RUN mkdir glue
RUN yum install -y python3 java-1.8.0-openjdk java-1.8.0-openjdk-devel tar git wget zip python3-pip
RUN pip3 install pandas
RUN pip3 install boto3
RUN pip3 install pynt
WORKDIR ./glue

构建它使用,例如:

docker build . -t glue

然后你可以在里面运行命令使用例如下面的语法:

docker run --rm  glue bash -c "mkdir a; ls -a; pwd"

我使用 --rm 因为我不想保留容器。

希望对您有所帮助。

我们无法直接登录到 docker 容器。 如果您想在容器以分离模式启动时 运行 任何特定命令,您可以在 Dockerfile 的 CMD 和 ENTRYPOINT 命令中给出它。

如果想直接进入shell,可以运行

docker -it run imageName

docker run imageName bash -c "ls -ltr;pwd"

它将 return 输出。 如果你在没有 -it 参数的情况下触发了 运行 命令,那么你可以使用以下命令进入容器:

docker exec -it imageName

然后您将降落到 shell。

现在,如果您正在使用 AWS codebuild 自定义映像并且关心如何将命令提交到容器,那么您必须将命令放入 build_spec.yaml 文件并将命令放入 pre_build、build 或 post_build 参数,这些命令将被提交到 docker 容器。

-build_spec.yml

version: 0.2
phases:
  pre_build:
    commands:
      - pip install boto3 #or any prebuild configuration

  build:
    commands:
      - spark-submit job.py
  post_build:
    commands:
      - rm -rf /tmp/*

更多关于 build_spec here