0

When I restart a container with docker-compose up with an entrypoint it's not stateless, it keep the context of the previous execution of the entrypoint.

docker-compose file:

version: '3.8'

services:
  test:
    image: debian:buster-slim
    entrypoint: ["/entrypoint.sh"]
    volumes:
      - ./entrypoint.sh:/entrypoint.sh
    command: ["echo", "100"]

entrypoint.sh file:

#!/bin/bash
set -e
set -x

mkdir folder

exec "$@"

the first time it log

Creating network "test_compose_entrypoint_default" with the default driver
Creating test_compose_entrypoint_test_1 ... done
Attaching to test_compose_entrypoint_test_1
test_1  | + mkdir folder
test_1  | + exec echo 100
test_1  | 100

if I rerun a docker-compose up , the second time it log

Starting test_compose_entrypoint_test_1 ... done
Attaching to test_compose_entrypoint_test_1
test_1  | + mkdir folder
test_1  | mkdir: cannot create directory 'folder': File exists
test_compose_entrypoint_test_1 exited with code 1

If I run docker-compose down and then it work again, but impossible to run two times in a row.

2
  • You aren't restarting, that's because you see the error, your container is still running, to restart it you need to run docker-compose restart Commented Oct 12, 2021 at 15:31
  • I tried with a docker-compose restart same problem
    – raphaelauv
    Commented Oct 12, 2021 at 15:50

1 Answer 1

2

In fact, docker-compose restart tries re-running the main container process in the existing (stopped) container. docker-compose up will default to reusing an existing container, if one exists with the right configuration, even if it's stopped. This can be a problem for setups like what you show that have the reasonable expectation of starting in a clean environment.

One approach is to code defensively around the possibility of the directory already existing:

# Create `folder` only if it doesn't exist.  Could still fail
# if the directory is read-only, or if `folder` is a plain file.
test -d folder || mkdir folder

At a higher level, you could docker-compose rm the existing container before re-launching it, or if you don't mind restarting everything, docker-compose up --force-recreate. This approach isn't compatible with an automatic restart: policy, though.

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.