#1452  docker 启动容器之前需要先把之前运行的容器停止,现在貌似不支持
Closed
hashtang opened 10 months ago

现在已经把docker镜像打包,docker容器启动这条线走通了,但是如果我继续更新版本,当他镜像打包完成之后,第二次启动的时候,由于容器名称和占用端口跟正在运行的容器相同, 导致无法正常启动。

那我如果在运行容器的步骤前面加上comman excute步骤,直接用docker命令终止正在运行的容器,会报错:docker 命令不存在。

这种情况怎么解决,感谢回复

Robin Shen commented 10 months ago

你的容器是以后台方式运行的吗?也就是说 OneDev 任务结束后容器还在运行?

hashtang commented 10 months ago

是的,后台运行。

那我又有个疑问,用 Run Docker Container默认启动的容器就是后台运行的吧,我好像没做啥其他的配置。

Robin Shen commented 10 months ago

Step 都是以前台方式运行的(没有加 --detach 选项)。可能是因为你指定了 --name 选项,这个选项不应该指定的,因为OneDev 会自己选择一个合适的 name,然后等待该名称的容器结束。

我推荐这种做法:

  1. 定义一个 shell executor
  2. 定义一个 job 使用 shell executor,然后运行command step,这个 step 里面运行 docker 命令来启动你的后台容器,可以选择任何你想要的名称和参数。在启动之前检查下如果容器已经运行的话,先停止同名称的容器。
  3. 通过 job dependency 来建立和其他任务的依赖关系,比如这个 job 可能需要依赖构建镜像的 job
hashtang commented 10 months ago

我试了一下这个流程,到执行shell那个job的时候,一直提示这个Pending resource allocation... image.png

以下是完整的配置文件,镜像打包步骤完全正常,执行shell一直卡着不开始。

version: 23
jobs:
- name: Build Docker
  jobExecutor: Docker-Executor
  steps:
  - !CheckoutStep
    name: checkout
    cloneCredential: !DefaultCredential {}
    withLfs: false
    withSubmodules: false
    condition: ALL_PREVIOUS_STEPS_WERE_SUCCESSFUL
  - !BuildImageStep
    name: Build Docker Image
    tags: app
    publish: false
    condition: ALL_PREVIOUS_STEPS_WERE_SUCCESSFUL
  triggers:
  - !BranchUpdateTrigger
    branches: master
  retryCondition: never
  maxRetries: 3
  retryDelay: 30
  timeout: 3600
- name: Run Docker
  jobExecutor: internal
  steps:
  - !CommandStep
    name: Run Docker Container
    runInContainer: false
    interpreter: !DefaultInterpreter
      commands:
      - docker stop aigc-app >/dev/null 2>&1 || true
      - docker rm aigc-app >/dev/null 2>&1 || true
      - docker run --name app -p 3001:3001 -d app
    useTTY: false
    condition: ALL_PREVIOUS_STEPS_WERE_SUCCESSFUL
  triggers:
  - !DependencyFinishedTrigger {}
  jobDependencies:
  - jobName: Build Docker
    requireSuccessful: true
    artifacts: '**'
  retryCondition: never
  maxRetries: 3
  retryDelay: 30
  timeout: 3600

Robin Shen commented 10 months ago

OneDev 是以什么方式运行的(bare metal/docker/k8s)? internal executor 是怎么定义的?

hashtang commented 10 months ago

OneDev 是以Docker方式运行的

internal executor image_2.png

Robin Shen commented 10 months ago

那启动 agent 了吗?Agent 不要通过docker 方式启动,否则也没法访问本机的shell

hashtang commented 10 months ago

牛逼,可以了,我以前的onedev版本太老了,前两天升级到了最新版,agent被自动停止了,而且多了一些文件,直接启动不了,重新下agent并启动就好了

hashtang changed state to 'Closed' 10 months ago
Previous Value Current Value
Open
Closed
issue 1 of 1
Type
Question
Priority
Normal
Assignee
Issue Votes (0)
Watchers (4)
Reference
onedev/server#1452
Please wait...
Page is in error, reload to recover