Why does the pipeline not seem to be using my custom docker image?
Asked by Taylor McLean:

In my pipelines yml file, I specify a custom image to use from my AWS ECR repository. When the pipeline runs, the "Build setup" logs suggests that the image was pulled in and used without issue:

    Images used:    
    build : http://604671003945.dkr.ecr.ca-central-1.amazonaws.com/labnetic-pipeline@sha256:346c49ea675d8a0469ae1ddb0b21155ce35538855e07a4541a0de0d286fe4e80

I had worked through some issues locally relating to having my Cypress E2E test suite run properly in the container. Having fixed those issues, I expected everything to run the same in the pipeline. However, looking at the pipeline logs it seems that it was being run with an image other than the one I specified (I suspect it's using the Atlassian default image). Here is the source of my suspicion:

```
STDERR: /opt/atlassian/pipelines/agent/build/packages/server/node_modules/.cache/mongodb-memory-server/mongodb-binaries/4.0.14/mongod: /usr/lib/x86_64-linux-gnu/libcurl.so.4: version `CURL_OPENSSL_3' not found (required by /opt/atlassian/pipelines/agent/build/packages/server/node_modules/.cache/mongodb-memory-server/mongodb-binaries/4.0.14/mongod)
```

I know the working directory of the default Atlassian image is "/opt/atlassian/pipelines/agent/build/". Is there a reason that this image would be used and not the one I specified? Here is my pipelines config:

image:  
name: 123456789.dkr.ecr.ca-central-1.amazonaws.com/my-image:1.4  
aws:  
access-key: $AWS_ACCESS_KEY_ID  
secret-key: $AWS_SECRET_ACCESS_KEY

cypress-e2e: \&cypress-e2e  
name: "Cypress E2E tests"  
caches:  
- cypress  
- nodecustom  
- yarn  
script:  
- yarn pull-dev-secrets  
- yarn install  
- $(npm bin)/cypress verify \|\| $(npm bin)/cypress install \&\& $(npm bin)/cypress verify  
- yarn build:e2e  
- MONGOMS_DEBUG=1 yarn start:e2e \&\& yarn workspace e2e e2e:run  
artifacts:  
- packages/e2e/cypress/screenshots/\*\*  
- packages/e2e/cypress/videos/\*\*

pipelines:

custom:  
cypress-e2e:  
- step:  
\<\<: \*cypress-e2e


Answers:
author: Taylor McLean
body: For anyone who happens to stumble across this, I suspect that the repository is mounted into the pipeline container at "/opt/atlassian/pipelines/agent/build" rather than the working directory specified in the image. I ran a "pwd" which gave "/opt/atlassian/pipelines/agent/build", though I also ran a "cat /etc/os-release" which led me to the conclusion that it was in fact running the image I specified. I'm still not entirely sure why, even testing everything locally in the exact same container, I was getting that error.

For posterity: I was using an in-memory mongo database from this project "<https://github.com/nodkz/mongodb-memory-server>". It generally works by automatically downloading a mongod executable into your node_modules and using it to spin up a mongo instance. I was running into a similar error locally, which I fixed by upgrading my base image from a Debian 9 to a Debian 10 based image. Again, still not sure why it didn't run the same in the pipeline, I suppose there might be some peculiarities with how containers are run in pipelines that I'm unaware of. Ultimately my solution was installing mongod into the image itself, and forcing mongodb-memory-server to use that executable rather than the one in node_modules.


Tags: bitbucket-pipelines

cloud

docker